我正在尝试用Python创建一个解析器,我认为RegExp可以很好地避免大量的'if-statements'来检查输入是否正确 .
我有以下表达式
for i | if i < 100 | increment i{
lots of lines of code each ending with;
};
-
我想检查第一个
i
是否以字母(小写或大写)开头; -
然后它可以是任意数量的alphanum;
-
紧随
|
和if
. 我正在使用: -
然后与第一个_2386803相同(我不认为我可以存储第一个并检查是否相同?我可以吗?)
-
然后是运算符和
|
以及任意数量的数字 . -
然后是4个空格或1个制表符,以
;
结尾 -
,最后
};
结束 .
我有一些,但我无法将它们放在一起 .
这是我得到的,请指出我做错了什么 .
我到目前为止:
^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};$
括号区的末尾 .
请指出我可能遇到的这个正则表达式和我正在接受的目标的任何错误 .
EDIT:
当我尝试匹配@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)
1 回答
尝试
我将所有
[...]
组更改为(?:...)
,这是一个非捕获组 .我在
for
和increment|decrement
之后使用了一个反向引用来要求变量与for
之后的变量相同 .