2013-03-30 48 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