似乎我在Python中遇到了一个bug:(Python2.7.3(默认,Apr 10 2012,23:24:47) MSC v.1500 64位(AMD64)在win32上)
>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3FC60>
>>> re.match("0[5-7][5-9][0-9]{7}", "077512345") #dont match
>>> re.match("0[5-7][5-9][0-9]{7}", "07751234567") #match!
<_sre.SRE_Match object at 0x0000000002D3F920>
>>> re.match("0[5-7][5-9][0-9]{7}","07751234567777777777777777777777777777777777777777777777") #match!!
<_sre.SRE_Match object at 0x0000000002D3FC60>
所以我必须使用美元符号来“精确地”限制数字!我认为这是一个错误,因为在HTML5验证中,{7}表示“确切”7位数字,而在python中,它似乎表示“至少”,下面是它使用美元符号时的表现:
>>> re.match("0[5-7][5-9][0-9]{7}$", "0775123456") #match
<_sre.SRE_Match object at 0x0000000002D3F920>
>>> re.match("0[5-7][5-9][0-9]{7}$", "07751234567") #dont match
>>> re.match("0[5-7][5-9][0-9]{7}$", "077512345") #dont match
而这发生在所有其他正则表达式上,不仅仅是精确的数字匹配,还必须加上美元!
那么它是一个bug吗?或者这是设计出来的?
发布于 2012-09-15 06:53:57
这是设计好的。与re.search
相反,re.match
在字符串的开头匹配,后者匹配字符串中的任何位置。字符串后面的多余字符将被忽略。有关更多详细信息,请参阅http://docs.python.org/library/re.html#match。
其他也使用正则表达式的语言,如grep和perl,行为也是一样的。正则表达式主要用于搜索文本。
如果您想执行精确匹配,则必须指定美元符号,正如您自己也注意到的那样。
发布于 2012-09-15 06:54:43
re.match()
的文档说明:
如果字符串开头的零个或多个字符与正则表达式模式…匹配,则返回
(重点是我的。)
这意味着匹配完成后字符串中的所有字符都将被忽略。例如,下面的代码也可以:
>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456abc")
<_sre.SRE_Match at 0x10ee2e8b8>
正则表达式并不真正指定匹配必须锚定的位置。例如,Python也有re.search()
,默认情况下,它也没有锚定在开头。您始终可以使用^
和$
元字符显式指定锚定。
发布于 2012-09-15 06:56:37
正如其他人所说的..。不是bug,您的正则表达式没有清楚地说明为什么'$‘似乎可以修复它,但这个示例应该可以:
import re
print 'food: ',
print re.match('fo{2}d', 'food') # match found!
print 'fooood: ',
print re.match('fo{2}d', 'fooood') # no match!
{}
之后的任何内容都将为您提供您想要的行为,如果您希望字符串在数字之后结束,那么$
是合适的添加内容。
https://stackoverflow.com/questions/12432934
复制相似问题