我發現了一些我無法在Python re模塊中解釋的東西。 編纂(a*)*
或(a*|b)*
拋出一個錯誤:Python正則表達式奇怪的行爲
raise error, v # invalid expression sre_constants.error: nothing to repeat
我在JavaScript測試,這個正則表達式,它似乎是確定。
這是一個錯誤?
我發現了一些我無法在Python re模塊中解釋的東西。 編纂(a*)*
或(a*|b)*
拋出一個錯誤:Python正則表達式奇怪的行爲
raise error, v # invalid expression sre_constants.error: nothing to repeat
我在JavaScript測試,這個正則表達式,它似乎是確定。
這是一個錯誤?
是的,這是一個錯誤(或至少一個錯誤的特徵)。這是抱怨,如果a*
什麼都不匹配,它不知道如何捕獲0或更多的「nothings」。
Python中的一個錯誤。
http://bugs.python.org/issue2537
http://bugs.python.org/issue214033
也許一個 「錯誤」 是不是這裏的正確的單詞。不同種類的解釋...
哇!我在人生中發現了Python中的第一個bug =) – f0b0s 2011-05-03 12:57:56
a*
可以爲空,給(null)*
,這對翻譯沒有任何意義。 (a*|b)
也可以爲空,因爲它可以評估要麼(b)
或(a*)
。你可以使用(a+)*
因此(a+|b)*
我絕對同意你的觀點,但無論如何Mu Mind是對的。 – f0b0s 2011-05-03 12:57:33
@ f0b0s基本上@Mu和我說的是相同的東西 - 唯一的區別是如何明確 - 這就是爲什麼我向他提出優先進入他的原因。 – theheadofabroom 2011-05-03 13:11:32
Thanx爲您解釋。 – f0b0s 2011-05-03 13:15:16
這似乎是一個python的問題,請參見本http://bugs.python.org/issue214033
而且它是StackO以及regex error - nothing to repeat
Python實際上有一個重要原因是拒絕(a*)*
和(a*|b)*
。由於*
是貪婪的,它匹配它可以的最長的字符串。問題是,如果由*
修改的正則表達式爲空,則正則表達式解析器嘗試儘可能多地匹配空字符串的重複。這意味着它將匹配您測試的字符串中任意兩個字符之間的任意數量的空字符串。由於a*
處於捕獲組中,因此它必須捕獲所有這些空字符串,這是不可能的。
相關:http://stackoverflow.com/questions/3675144/regex-error-nothing-to-repeat – Kobi 2011-05-03 12:49:11
什麼是你的Python版本? – lzap 2011-05-03 12:52:40
我想補充一句:邏輯上,這些都沒有意義。 '(a *)*'與'a *'相同,'(a * | b)*'與'[ab] *'(或'(a | b)*')相同。出於好奇,有沒有好的用例? – Kobi 2011-05-03 13:00:01