为什么这个正则表达式:
>>> r = re.compile("[0-9]*", re.DEBUG)
像这样匹配:
>>> m = r.search("abc")
>>> m.group()
''
我希望它匹配整个字符串'abc'
,因为'a'
满足条件即匹配0位数,然后贪婪匹配将完整地包含字符串'abc'
。
答案 0 :(得分:5)
您搜索了0位或更多位数。它找到了0位或更多位数。它找到的确切位数是0.因此,空字符串。
答案 1 :(得分:4)
在上面的comment中,您说您希望[0-9]*
与abc
匹配,因为:
“abc”包含0位数。
你误解了一个字符类是什么,它包含了原子。你的目前不是负面的断言。
如果您不预先编译,可以与[^0-9]*
匹配。例如:
>>> import re
>>> re.search("[^0-9]*", "abc").group()
'abc'
这可能适合你的思维导图,但是认为否定的字符类“不包含范围”而不是“不包含任何包含的字符”可能会让你误入歧途在将来。 YMMV。
答案 2 :(得分:3)
你问过"找到零个或多个数字",所以它找到零个或多个数字(零;空字符串)。
如果您想要"找到零个或多个数字后跟零个或多个其他字符",您需要说(使用.*
模式)。 '[0-9]*'
匹配 'abc'
,因为'abc'
包含未包含在请求的表达式中的字符(字母)。
>>> r = re.compile('[0-9]*.*') # Note the very important ".*" that matches everything!
>>> r.search('abc').group()
'abc'
关键是"匹配"。如果你的表达式不包含[某个字符的表示](例如" a"),则它不可能匹配包含该字符的字符串!您的给定表达式仅匹配由零个或多个数字组成的字符串,而不包含任何其他内容。因此,它显然不匹配'abc'
。
正如Tigerhawk在评论中提到的,如果正则表达式中的*
表示"前面的模式为零或更多,或其他任何",它会非常无用,因为任何带有*
的模式都会一直匹配所有字符串!
答案 3 :(得分:2)
因为你的正则表达式只查找数字而abc没有任何数字。
简而言之,你的正则表达式匹配任何数字和空字符串。
答案 4 :(得分:1)
从documentation,search()
执行以下操作:
扫描字符串,查找此常规位置 表达式生成匹配项,并返回相应的匹配对象。 如果字符串中没有位置与模式匹配,则返回None;注意 这与在某个时刻找到零长度匹配不同 在字符串中。
因此,m
不是None
的事实表明它找到了匹配项。 m.group()
返回''
的事实显示匹配的内容。