为什么 '[0-9]*' 在我的 Python 正则表达式中不匹配 'abc',因为字符串中有零个或多个数字?



为什么regex:

>>> 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个或多个数字",因此它找到0个或多个数字(0;空字符串)。

如果你想要"找到0个或多个数字后面跟着0个或多个其他字符",你需要(使用.*模式)。'[0-9]*'不匹配 'abc',因为'abc'包含不包含在请求表达式中的字符(字母)。

>>> r = re.compile('[0-9]*.*')  # Note the very important ".*" that matches everything!
>>> r.search('abc').group()
'abc'

关键是"match"这个词。如果表达式不包含某个字符(如"a")的[表示形式],那么它不可能匹配包含该字符的字符串!给定的表达式只匹配由0个或多个数字组成的字符串,而不匹配其他。因此,它显然与'abc'不匹配。


正如Tigerhawk在评论中提到的,如果正则表达式中的*意味着"前面的模式,或其他任何中的零或多个",那么它将是非常无用的,因为任何包含*的模式都会匹配所有字符串,所有时间!

因为您的正则表达式只查找数字,而ABC中没有任何数字。

简而言之,你的正则表达式匹配任何带有数字和空字符串的内容。

根据文档,search()执行以下操作:

扫描字符串,寻找这个正则的位置表达式生成匹配,并返回相应的匹配对象。如果字符串中没有匹配模式的位置,则返回None;请注意这和在某个点找到零长度匹配是不同的

因此,m不是None的事实表明它找到了一个匹配。m.group()返回''的事实显示了它匹配的内容

相关内容

最新更新