簡體   English   中英

Python正則表達式行為奇怪

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM