正则表达式:如果,否则,如果,否则
我试图解析使用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声明如果和否则,如果。 其他如果在该示例中被识别为如果。
不要这样做;改为使用pyparsing
。你稍后会感谢你。
的问题是,.+
是贪婪的,所以它吃起来else
...做.+?
来代替。或者说,不要,因为你现在正在使用pyparsing
。
regex_cond = re.compile(r'.+?(else\sif|else|if).+?')
...
# else if
a \ t匹配一个制表符。它看起来不像第2行中的“else”和“if”之间有制表符。您可以尝试\,而不是匹配任何空格字符。
我可能还建议你可以删除双括号((...))并用一个集合(...)替换,因为一个集合将提供捕获和替代。 – 2010-08-12 14:53:26
谢谢,但它仍然匹配,如果不是,如果。 – mrks 2010-08-12 14:57:55
是的,但不是唯一的问题。 – katrielalex 2010-08-12 15:09:22
纠正我,如果即时通讯错误,但RE不适合解析,因为它只适用于Type2语言。例如,你不能决定天气((())()))是一个没有“计数”的正确的语句,正则表达式不能这样做。或者,谈谈你的例子,如果别的东西不能被发现是无效的。也许我会混合扫描仪/解析器,在这种情况下,请告诉我。
使用正则表达式解析嵌套结构在[这个SO问题]中被击倒得相当好(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)。这个问题与HTML相关,但同样适用于任何嵌套结构 – NealB 2010-08-12 14:56:56
你眼前的问题是,.+
是贪婪的,所以它匹配@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
一个更好的方法。
不是标签吗?所以它实际上是搜索其他,而不是如果?我会尝试切换到其他\ sif。 –
martiert
2010-08-12 14:43:18