2011-05-03 63 views
9

我發現了一些我無法在Python re模塊中解釋的東西。 編纂(a*)*(a*|b)*拋出一個錯誤:Python正則表達式奇怪的行爲

raise error, v # invalid expression sre_constants.error: nothing to repeat

我在JavaScript測試,這個正則表達式,它似乎是確定。

這是一個錯誤?

+2

相關:http://stackoverflow.com/questions/3675144/regex-error-nothing-to-repeat – Kobi 2011-05-03 12:49:11

+0

什麼是你的Python版本? – lzap 2011-05-03 12:52:40

+1

我想補充一句:邏輯上,這些都沒有意義。 '(a *)*'與'a *'相同,'(a * | b)*'與'[ab] *'(或'(a | b)*')相同。出於好奇,有沒有好的用例? – Kobi 2011-05-03 13:00:01

回答

9

是的,這是一個錯誤(或至少一個錯誤的特徵)。這是抱怨,如果a*什麼都不匹配,它不知道如何捕獲0或更多的「nothings」。

5

a*可以爲空,給(null)*,這對翻譯沒有任何意義。 (a*|b)也可以爲空,因爲它可以評估要麼(b)(a*)。你可以使用(a+)*因此(a+|b)*

+0

我絕對同意你的觀點,但無論如何Mu Mind是對的。 – f0b0s 2011-05-03 12:57:33

+0

@ f0b0s基本上@Mu和我說的是相同的東西 - 唯一的區別是如何明確 - 這就是爲什麼我向他提出優先進入他的原因。 – theheadofabroom 2011-05-03 13:11:32

+0

Thanx爲您解釋。 – f0b0s 2011-05-03 13:15:16

1

Python實際上有一個重要原因是拒絕(a*)*(a*|b)*。由於*是貪婪的,它匹配它可以的最長的字符串。問題是,如果由*修改的正則表達式爲空,則正則表達式解析器嘗試儘可能多地匹配空字符串的重複。這意味着它將匹配您測試的字符串中任意兩個字符之間的任意數量的空字符串。由於a*處於捕獲組中,因此它必須捕獲所有這些空字符串,這是不可能的。