3

我正在使用 Python 2.7.3 我有以下功能:

def is2To4Numbers(q):
    if re.match('[0-9]{2,4}',q):return True
    else: return False

我试图将位数限制为 2 到 4。但我得到了这些结果。

>>> is2To4Numbers('1235')
True

>>> is2To4Numbers('1')
False

>>> is2To4Numbers('12345')
True

>>> is2To4Numbers('1234567890')
True

我似乎无法获得正确的限制。我应该如何解决这个问题?除了使用 {m,n} 还有其他方法吗?还是我什至正确使用 {m,n} ?

4

2 回答 2

11

您的正则表达式只查找存在于您的较大数字中的 2 到 4 位数字。添加这个:

'^[0-9]{2,4}$'

仅使用内置数字测试并添加大于和小于检查可能会容易得多,如下所示:

def is2To4Numbers(q):
    try:
        return 10 <= int(q) <= 9999
    except:
        return False
于 2013-01-04T19:06:08.240 回答
5

如果您想在较大的字符串中精确搜索 2 到 4 位数字,因此不能使用^and$作为模式的一部分,那么您可以使用负后瞻( ?<!) 和负前瞻 ( ?!):

import re

def is2To4Numbers(q):
    return bool(re.search(r'''(?x)    # verbose mode
                              (?<!\d) # not preceded by a digit 
                              \d{2,4} # 2-to-4 digits
                              (?!\d)  # not followed by a digit
                              ''',q))

tests = ['1', '12', '123', '1234', '12345', 'foo12', '123bar']
for test in tests:
    print('{t:6} => {r}'.format(t = test, r = is2To4Numbers(test)))

产量

1      => False
12     => True
123    => True
1234   => True
12345  => False
foo12  => True
123bar => True
于 2013-01-04T19:19:49.653 回答