我正在使用Python 2.7.3我有以下功能:
def is2To4Numbers(q):
if re.match('[0-9]{2,4}',q):return True
else: return False
Run Code Online (Sandbox Code Playgroud)
我试图限制从2到4的位数.但我得到这些结果.
>>> is2To4Numbers('1235')
True
>>> is2To4Numbers('1')
False
>>> is2To4Numbers('12345')
True
>>> is2To4Numbers('1234567890')
True
Run Code Online (Sandbox Code Playgroud)
我似乎无法获得正确的限制.我该怎么解决这个问题?除了使用{m,n}之外还有其他方法吗?或者我甚至正确使用{m,n}?
你的正则表达式只查找2到4位数字,它们存在于较大的数字中.添加这个:
'^[0-9]{2,4}$'
Run Code Online (Sandbox Code Playgroud)
使用内置的数值测试并添加大于和小于这样的检查可能要容易得多:
def is2To4Numbers(q):
try:
return 10 <= int(q) <= 9999
except:
return False
Run Code Online (Sandbox Code Playgroud)
如果您想在较大的字符串中准确搜索 2 到 4 位数字,因此不能使用^和$作为模式的一部分,那么您可以使用负向后视( ?<!) 和负向后视 ( ?!):
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)))
Run Code Online (Sandbox Code Playgroud)
产量
1 => False
12 => True
123 => True
1234 => True
12345 => False
foo12 => True
123bar => True
Run Code Online (Sandbox Code Playgroud)