2011-04-20 39 views
1

我想匹配任何下列行與蟒蛇正則表達式:Python的正則表達式的問題

RAA RAA 

RAA RAA/OOO OOO 

RAA RAA/OOO OOO/ROCKY 

這些字符串應該總是對自己行,以便RAA RAA moves over there.將不匹配。

我想出了這個正則表達式使用RegExr:

^([A-Z]*([ ]?)*([A-Z]?)*([ \/]?)*)*$ 

這工作得很好,以配合各種不同的線但是它會導致蟒蛇,如果它試圖匹配RAA RAA moves over there.

我不知道掛爲什麼。有沒有任何正則表達式專家可能有一些洞察力?

+0

定義「掛起」 - 你等了多久?另請注意,單字符類是多餘的,'*'意味着'?'(例如,'([]?)*'是'\ *'sans反斜槓,我不得不加入,因爲markdown有時也會嘗試很難不掩蓋無標記的文字)。 – delnan 2011-04-20 16:25:30

+4

你只想匹配只包含大寫字母,正斜槓和空格的行嗎?我不清楚你以後的財產是什麼? – YXD 2011-04-20 16:26:53

+3

你說過「匹配這三條線」,然後給我們一個匹配更多的正則表達式。請更具體地瞭解這些要求。 – 2011-04-20 16:30:21

回答

0

您的整個模式都充滿了可選的匹配,這可能會導致大量的回溯,從而導致懸掛體驗。嘗試使用在有意義的強制性匹配,如:

^([A-Z]+([ ]?)+([A-Z])*([ /])*)*$ 

的清潔器圖案,沒有不必要的捕獲組,將是:

^([A-Z]+[ ]?)+([A-Z]+[ /]*)*$ 

注意,使用的+代替*確保至少有一個字符必須匹配,而不是使整個模式可選並徵稅正則表達式引擎。

+0

這絕對是我需要的。我的正則表達式技能是非常不足的,所以這個建議非常感謝。 – 2011-04-21 07:55:33

2

這個正則表達式太籠統了:它不僅比你想要的匹配得多,而且它有很多* s正則表達式匹配器會不斷地毫無意義地回溯到其他組合。我沒有嘗試使用組合樹,但每個非匹配行至少有數千次嘗試。

具體越好,並確保你不走回頭路過你什麼承諾更好:

^RAA RAA(?: \/ OOO OOO(?: \/ ROCKY)?)?$ 

如果子不是恆定的,你應該儘可能完整地指定他們避免不必要的回溯。

?:是另一個小的優化:不要記錄加括號的匹配以便以後提取。如果您確實需要子字符串,我的猜測是您不希望/與他們在一起,想要。)