2013-03-30 103 views
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'

我想 'Python的正则表达式+' 是应该是1还是更多,'*'是0还是更正确? RE应该是贪婪的。那么他们为什么不都回报同样的事情,更重要的是为什么第一个回报没有?

回答

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 

我想允许在冒号后面的空格的数量(甚至为零)。我会使用(\w+):\s*(\w+)这样的正则表达式,其中\s*匹配零个或多个空格。由于它出现在模式中的冒号后面,它将匹配紧跟在字符串中的冒号,然后匹配一个零长度字符串(如第三行blah:blah,因为冒号结束匹配后的'b')或全部在下一个非空格之前有空格,因为*是贪婪的。

+0

对不起,我猜我还是不明白。你说它会“尽量在匹配的地方匹配尽可能多的数字”,但显然它可以在搜索字符串的相同位置匹配更多的数字是正确的?通过行为,我看到为什么会有人使用'*'?难道它不会总是返回一个空字符串,因为它总是匹配0个字符吗? – asolberg

+0

我添加了一个更详细的描述,发生了什么事情,我希望它有帮助! –

+0

伟大我想我现在明白了这是非常有用的谢谢。 – asolberg