我正在尝试用Python创建一个解析器,我认为RegExp可以很好地避免大量的'if-statements'来检查输入是否正确。
我有以下表达式
for i | if i < 100 | increment i{
lots of lines of code each ending with;
};
i
是否以字母(小写或大写)开头; |
和if
。我正在使用:i
相同(我不认为我可以存储第一个并检查是否相同?我可以吗?)|
以及任意数量的数字。;
};
结尾。我得到了一些,但我无法将它们组合在一起。
这是我得到的,请指出我做错了什么。
我到目前为止:
^for [a-z|A-Z]\w* \| if [a-z|A-Z]\w* [<|>|==|>=|<=] \d+ \| [increment|decrement] [a-z|A-Z]\w*{\n[ {4}|\t].*;\n};$
故障:
[a-z|A-Z]\w
以字母(大写和小写)开头,后面可以跟任意数字的字母。
[<|>|==|>=|<=]
可能的运营商。
\d+
任何数字。
[increment|decrement]
这是一个不起作用,我想匹配这两个单词中的任何一个。我尝试使用\b
或^
和$
。
{\n
括号区的开头。
{\n[ {4}|\t].*;
这也不起作用,{4}
应匹配4个空格,\t
标签。
\n};$
括号区的末尾。
请指出我在这个正则表达式中遇到的任何错误以及我正在接触的目标。
修改
当我尝试匹配@Barmar正则表达式时,我得到了无。
这是测试代码:
import re
f = "for i | if i < 100 | increment i{\n\tlots of lines of code each ending with;\n};"
print re.findall("^for ([a-zA-z]\w*) \| if \1 (?:<|>|==|>=|<=) \d+ \| (?:increment|decrement) \1{"
"\n(?: {4}|\t]=).*;\n};$",f)
答案 0 :(得分:1)
尝试
^for ([a-zA-z]\w*) \| if \1 (?:<|>|==|>=|<=) \d+ \| (?:increment|decrement) \1{\n(?: {4}|\t]=).*;\n};$
我将您的所有[...]
群组更改为(?:...)
,这是一个非捕获群组。
我在for
和increment|decrement
后使用了反向引用,要求变量与for
之后的变量相同。