2010-08-12 46 views
0

我试图解析使用Python和正则表达式正则表达式:如果,否则,如果,否则

regex_cond = re.compile(r'.+((else\tif|else|if)).+') 
line2 = '@s0 else if (insreg==1) then (initx,PING,notend) -> sinitx;' 
match = regex_cond.match(line2); 

我有问题要区分Gezel语言(http://rijndael.ece.vt.edu/gezel2/)的FSM声明如果否则,如果其他如果在该示例中被识别为如果

+1

不是标签吗?所以它实际上是搜索其他,而不是如果?我会尝试切换到其他\ sif。 – martiert 2010-08-12 14:43:18

回答

2

不要这样做;改为使用pyparsing。你稍后会感谢你。


的问题是,.+是贪婪的,所以它吃起来else ...做.+?来代替。或者说,不要,因为你现在正在使用pyparsing

regex_cond = re.compile(r'.+?(else\sif|else|if).+?') 
... 
# else if 
3

a \ t匹配一个制表符。它看起来不像第2行中的“else”和“if”之间有制表符。您可以尝试\,而不是匹配任何空格字符。

+0

我可能还建议你可以删除双括号((...))并用一个集合(...)替换,因为一个集合将提供捕获和替代。 – 2010-08-12 14:53:26

+0

谢谢,但它仍然匹配,如果不是,如果。 – mrks 2010-08-12 14:57:55

+0

是的,但不是唯一的问题。 – katrielalex 2010-08-12 15:09:22

0

纠正我,如果即时通讯错误,但RE不适合解析,因为它只适用于Type2语言。例如,你不能决定天气((())()))是一个没有“计数”的正确的语句,正则表达式不能这样做。或者,谈谈你的例子,如果别的东西不能被发现是无效的。也许我会混合扫描仪/解析器,在这种情况下,请告诉我。

+0

使用正则表达式解析嵌套结构在[这个SO问题]中被击倒得相当好(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。这个问题与HTML相关,但同样适用于任何嵌套结构 – NealB 2010-08-12 14:56:56

1

你眼前的问题是,.+是贪婪的,所以它匹配@s0 else,而不是仅仅@s0。要使它非贪婪,使用.+?代替:

import re 

regex_cond = re.compile(r'.+?(else\s+if|else|if).+') 
line2 = '@s0 else if (insreg==1) then (initx,PING,notend) -> sinitx;' 
match = regex_cond.match(line2) 
print(match.groups()) 
# ('else if',) 

然而,像其他人所说,使用解析器像Pyparsing比这里使用re一个更好的方法。