我正在尝试使用Python和正则表达式解析Gezel语言(http://rijndael.ece.vt.edu/gezel2/)的FSM语句
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);
我有问题要区分 if 和 else if 。示例中的 else if 被识别为 if 。
答案 0 :(得分:3)
\ t \ t匹配制表符。看起来你在line2中的“else”和“if”之间没有制表符。您可以尝试使用\ s,它匹配任何空格字符。
答案 1 :(得分:2)
不要这样做;请改用pyparsing
。你以后会感谢自己。
问题是.+
贪婪,所以它正在吃掉else
...做.+?
。或者更确切地说,不要,因为你现在正在使用pyparsing
。
regex_cond = re.compile( r'.+?(else\sif|else|if).+?' )
...
# else if
答案 2 :(得分: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
更好的方法。
答案 3 :(得分:0)
如果我错了,请纠正我,但RE不适合解析,因为它只适用于Type2语言。对于exaple你不能决定天气((())()))是一个没有“计数”的有效语句,正则表达式不能做。或者,谈谈你的例子,如果不能找到其他的无效。也许im mixiung up扫描仪/解析器,在这种情况下请告诉我。