为什么';t';[0-9]*';匹配';abc&x27;在我的Python正则表达式中,因为字符串中有零个或多个数字?
为什么这个正则表达式:为什么';t';[0-9]*';匹配';abc&x27;在我的Python正则表达式中,因为字符串中有零个或多个数字?,python,regex,python-2.7,grep,character-class,Python,Regex,Python 2.7,Grep,Character Class,为什么这个正则表达式: >>> r = re.compile("[0-9]*", re.DEBUG) 这样搭配: >>> m = r.search("abc") >>> m.group() '' 我希望它能够匹配整个字符串'abc',因为'a'满足匹配0位的条件,然后贪婪匹配将包括整个字符串'abc'。因为您的正则表达式只查找数字,而abc中没有任何数字 简而言之,您的正则表达式匹配任何带有数字和空字符串的内容。从,搜索()执行以下操作:
>>> r = re.compile("[0-9]*", re.DEBUG)
这样搭配:
>>> m = r.search("abc")
>>> m.group()
''
我希望它能够匹配整个字符串
'abc'
,因为'a'
满足匹配0位的条件,然后贪婪匹配将包括整个字符串'abc'
。因为您的正则表达式只查找数字,而abc中没有任何数字
简而言之,您的正则表达式匹配任何带有数字和空字符串的内容。从,搜索()
执行以下操作:
在字符串中扫描,查找此正则表达式所在的位置
表达式生成匹配,并返回相应的匹配对象。
如果字符串中没有与模式匹配的位置,则返回None;笔记
这不同于在某个点上找到零长度匹配
在字符串中
因此,
m
不是None
这一事实表明它找到了匹配项。m.group()
返回'
的事实显示了它匹配的内容。您搜索了0个或更多数字。它找到了0个或多个数字。它找到的确切位数为0。因此,空字符串。您要求“为我找到零个或多个数字”,因此它为您找到了零个或多个数字(零;空字符串)
如果您想“找到零个或多个数字,后跟零个或多个其他字符”,您需要这样说(使用*
模式)<代码>'[0-9]*'与'abc'
不匹配,因为'abc'
包含请求表达式中未包含的字符(字母)
>>> r = re.compile('[0-9]*.*') # Note the very important ".*" that matches everything!
>>> r.search('abc').group()
'abc'
关键是“匹配”这个词。如果表达式不包含某个字符(如“a”)的[a表示形式],则它可能无法匹配包含该字符的字符串!给定的表达式只匹配由零个或多个数字组成的字符串,而不匹配其他任何数字。因此,它显然与
“abc”
不匹配
正如Tigerhawk在评论中提到的那样,如果正则表达式中的
*
表示“前面的模式或任何其他模式的零个或多个”,它将是非常无用的,因为任何带有*
的模式都将始终匹配所有字符串 使用否定字符类
在上面的例子中,您说您希望[0-9]*
与abc
匹配,因为:
“abc”包含0位数字
你误解了角色类是什么,它包含原子。您的当前不是一个否定的断言
如果不进行预编译,则可以使用[^0-9]*
获取匹配项。例如:
>>> import re
>>> re.search("[^0-9]*", "abc").group()
'abc'
这可能适合你的心理地图,但将否定的角色类视为“不包含范围”而不是“不包含任何包含的角色”可能会在未来将你引入歧途。YMMV.[0-9]*匹配数字,为什么您希望“abc”匹配它?@XiaotianPei,因为“abc”包含0个数字。明白我的意思了吗?但为什么它匹配的是空字符串而不是包含零个数字的“abc”。如果
*
是这样工作的,它将一直消耗到字符串的末尾。相反,它只使用它应该重复的字符。@TigerhawkT3“*只使用它应该重复的字符”,这是一个很好的观点。很抱歉,我可能会觉得太迂腐了,但“abc”完全满足正则表达式中规定的条件,即:为我找到0或更多数字。@abc它找到了0或更多数字。您没有要求匹配非数字字符,因此这些字符不匹配。同样,如果*
是这样工作的,它会将所有内容匹配到字符串的末尾,因此毫无用处。@abc不,它满足了您所要求的内容,但您无法重新定义语言以适应您的心理地图。实际上,您要求Python做的是“返回上一个类中零个或多个字符的匹配模式,其中不包括任何字母字符。”因为它确实匹配零位数字,所以它正确地返回了匹配的模式,而匹配的模式恰好是空字符串。@CodeGnome很好。谢谢。我也把你下面的答案投了赞成票。亨利的回答似乎最能回答我的问题。