Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t';[0-9]*';匹配';abc&x27;在我的Python正则表达式中,因为字符串中有零个或多个数字?_Python_Regex_Python 2.7_Grep_Character Class - Fatal编程技术网

为什么';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很好。谢谢。我也把你下面的答案投了赞成票。亨利的回答似乎最能回答我的问题。