[英]Python regular expressions acting strangely
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應該是貪婪的。 那么為什么他們都沒有返回同樣的東西,更重要的是為什么第一個沒有返回?
你對+
和*
的含義是正確的。 所以\\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+)
的正則表達式(\\w+):\\s*(\\w+)
其中\\s*
匹配零個或多個空格。 因為它出現在模式中的冒號之后,它將匹配字符串中的冒號之后,然后匹配零長度字符串(如第三行中的blah:blah
因為冒號結束匹配后的'b')或者所有空間都在下一個非空間之前,因為*
是貪婪的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.