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