2011-04-20 73 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)?)?$ 

如果子不是恒定的,你应该尽可能完整地指定他们避免不必要的回溯。

?:是另一个小的优化:不要记录加括号的匹配以便以后提取。如果您确实需要子字符串,我的猜测是您不希望/与他们在一起,想要。)