0

看来我在 python 中遇到了一个错误:(Python 2.7.3(默认,2012 年 4 月 10 日,23:24:47)[MSC v.1500 64 位(AMD64)] on 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

这发生在所有其他正则表达式中,不仅精确的数字匹配,还必须添加美元!

这是一个错误吗?还是设计使然?

4

3 回答 3

4

这是设计使然。re.match匹配字符串的开头,而不是re.search匹配字符串中的任何位置。字符串后面的额外字符将被忽略。有关详细信息,请参阅http://docs.python.org/library/re.html#match 。

其他也使用正则表达式的语言,例如 grep 和 perl,其行为相同。正则表达式主要用于搜索文本。

如果您想执行完全匹配,您必须指定美元符号,正如您自己也指出的那样。

于 2012-09-14T22:53:57.113 回答
2

状态的文档re.match()

如果字符串开头的零个或多个字符与正则表达式模式匹配...</p>

(强调我的。)

这意味着匹配完成后字符串中的所有字符都将被忽略。例如,以下内容也可以工作:

>>> re.match("0[5-7][5-9][0-9]{7}", "0775123456abc")
<_sre.SRE_Match at 0x10ee2e8b8>

正则表达式并没有真正指定匹配必须锚定的位置(如果在任何地方)。例如,Python 也有re.search()默认情况下不在开头锚定的。您始终可以使用^$元字符显式指定锚定。

于 2012-09-14T22:54:43.193 回答
2

正如其他人所说......不是一个错误,你的正则表达式并没有说明为什么 '$' 似乎可以修复它,但这个例子应该:

import re

print 'food: ',
print re.match('fo{2}d', 'food')     # match found!

print 'fooood: ',
print re.match('fo{2}d', 'fooood')   # no match!

之后的任何内容{}都会为您提供所需的行为,如果您希望字符串在数字之后结束,那么在此处添加任何内容$都是合适的。

于 2012-09-14T22:56:37.483 回答