了解RegExp

时间:2014-07-15 06:03:46

标签: python regex

我正在尝试用Python创建一个解析器,我认为RegExp可以很好地避免大量的'if-statements'来检查输入是否正确。

我有以下表达式

for i | if i < 100 | increment i{
    lots of lines of code each ending with;
};
  1. 我想检查第一个i是否以字母(小写或大写)开头;
  2. 然后它可以是任何数量的alphanum;
  3. 后跟|if。我正在使用:
  4. 然后与第一个i相同(我不认为我可以存储第一个并检查是否相同?我可以吗?)
  5. 然后是运营商和|以及任意数量的数字。
  6. 然后是4个空格或1个制表符,以;
  7. 结尾
  8. 最后是};结尾。
  9. 我得到了一些,但我无法将它们组合在一起。

    这是我得到的,请指出我做错了什么。

    我到目前为止:

    ^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)
    

1 个答案:

答案 0 :(得分:1)

尝试

^for ([a-zA-z]\w*) \| if \1 (?:<|>|==|>=|<=) \d+ \| (?:increment|decrement) \1{\n(?: {4}|\t]=).*;\n};$

我将您的所有[...]群组更改为(?:...),这是一个非捕获群组。

我在forincrement|decrement后使用了反向引用,要求变量与for之后的变量相同。