Python 正则表达式:if,else if,else

Python 正则表达式:if,else if,else,python,regex,Python,Regex,我试图使用Python和正则表达式解析Gezel语言()的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); 我很难区分“如果”和“如果”。示例中的else if被识别为if。a\t与制表符匹配。第2行中的“else

我试图使用Python和正则表达式解析Gezel语言()的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);

我很难区分“如果”和“如果”。示例中的else if被识别为if。

a\t与制表符匹配。第2行中的“else”和“if”之间似乎没有制表符。您可以改为尝试\s,它匹配任何空白字符。

a\t匹配制表符。第2行中的“else”和“if”之间似乎没有制表符。您可以改为尝试\s,它匹配任何空白字符。

如果我错了,请更正我,但RE不适合解析,因为它仅适用于Type2语言。例如,你不能决定天气是否((())())是一个没有“计数”的有效语句,这是正则表达式不能做到的。或者,谈论一下你的例子,如果其他的都不能被认为是无效的。也许我混淆了扫描仪/解析器,在这种情况下请告诉我

如果我错了,请纠正我,但是RE不适合解析,因为它只适用于Type2语言。例如,你不能决定天气是否((())())是一个没有“计数”的有效语句,这是正则表达式不能做到的。或者,谈论一下你的例子,如果其他的都不能被认为是无效的。也许我混淆了扫描仪/解析器,在这种情况下请告诉我

不要这样做;改用。你以后会感谢你自己的


问题是,
+
是贪婪的,所以它正在吞噬
其他的
。。。改为执行
+?
。或者更确切地说,不要这样做,因为您现在正在使用
pyparsing

regex_cond = re.compile( r'.+?(else\sif|else|if).+?' )
...
# else if
不要这样做;改用。你以后会感谢你自己的


问题是,
+
是贪婪的,所以它正在吞噬
其他的
。。。改为执行
+?
。或者更确切地说,不要这样做,因为您现在正在使用
pyparsing

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

你眼前的问题是
+
是贪婪的,因此它匹配
@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',)

然而,正如其他人所建议的,在这里使用类解析器比使用
re
更好。

您当前的问题是
+
是贪婪的,因此它匹配
@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',)

然而,正如其他人所建议的,在这里使用类解析器比使用
re
更好。

不是一个选项卡吗?所以它实际上是在搜索elseif而不是elseif?如果不是选项卡,我会尝试切换到其他选项卡?所以它实际上是在搜索elseif而不是elseif?我会尝试切换到else\sif。我还可能建议您删除双括号(…)并替换为一组(…),因为一组将同时提供捕获和备用。这是真的,但不是唯一的问题。我还可能建议您删除双括号(…)并替换为一组(…),因为一个集合将同时提供一个捕获和一个替代。这是真的,但不是唯一的问题。用正则表达式解析嵌套结构在年被很好地解决了。这个问题与HTML有关,但同样适用于任何嵌套结构。使用正则表达式的嵌套结构在年被很好地解决了。这个问题与HTML有关,但同样适用于任何嵌套结构