3
url = "http://www.domain.com/7464535"
match = re.search(r'\d*',url)
match.group(0)

返回 '​​' <----- 空字符串

url = "http://www.domain.com/7464535"
match = re.search(r'\d+',url)
match.group(0)

返回“7464535”

我认为“+”应该是 1 或更多,而“*”应该是 0 或更多是否正确?RE应该是贪婪的。那么为什么他们不都返回同样的东西,更重要的是为什么第一个什么都不返回呢?

4

1 回答 1

9

+您对和的含义是正确的*。所以\d*将匹配零个或多个数字——这正是它正在做的事情。从字符串的开头开始,它匹配零位数字,然后就完成了。它成功匹配零个或多个数字。

*是贪心的,但这仅意味着它将在匹配的位置匹配尽可能多的数字。它不会放弃匹配来尝试在字符串中稍后找到更长的匹配。


编辑:更详细的描述正则表达式引擎的作用:

以我们要搜索的字符串为"http://www.domain.com/7464535"且模式为的情况为例\d+

一开始,正则表达式引擎指向我们 URL 的开头和正则表达式模式的开头。\d+需要匹配一个或多个数字,所以首先正则表达式引擎必须找到至少一个数字才能成功匹配。

它看起来的第一个地方找到了一个“h”字符。那不是数字,所以它移动到“t”,然后是下一个“t”,依此类推,直到最终到达“7”。现在我们已经匹配了一个数字,所以“一个或多个”的要求得到了满足,我们可以成功匹配,除了+贪心,它会匹配尽可能多的数字而不改变匹配的起点,' 7'。所以它到达字符串的末尾并匹配整数'7464535'。

现在考虑我们的模式是否是\d*. 现在唯一的区别是零位是有效匹配。由于正则表达式从左到右匹配,因此第一个\d*匹配的位置是字符串的开头。所以我们在开始时有一个零长度匹配,但由于*是贪心的,只要有数字,它就会扩展匹配。由于我们找到的第一件事是'h',一个非数字,它只返回零长度匹配。

那么*,如果它只会给你一个零长度的匹配,那么它还有什么用呢?考虑一下我是否匹配这样的配置文件:

foo: bar
baz:   quux
blah:blah

I want to allow any amount of spaces (even zero) after the colon. I would use a regex like (\w+):\s*(\w+) where \s* matches zero or more spaces. Since it occurs after the colon in the pattern, it will match just after the colon in the string and then either match a zero-length string (as in the third line blah:blah because the 'b' after the colon ends the match) or all the spaces there are before the next non-space, because * is greedy.

于 2013-03-30T01:00:57.153 回答