2015-11-07 80 views
-3

我想开发一个正则表达式来匹配python if语句等内的所有内容。到目前为止,我的开头匹配为':[\n][\t]',但我无法找出正则表达式来检测Python中if语句的结束。到目前为止,我能想到的最好的是[\n][^\t],因为我知道当一个换行符没有跟随一个制表符时退出了一个块。正则表达式匹配Python中的所有内容If语句

+2

您是否考虑过使用'ast'代替? – roippi

+0

实际上,当缩进停止时,块将退出。标签不是必需的。 –

+0

这在一般情况下很难。考虑评论(可能在LH边界),在这里文件只是两个困难。正如roippi所说的那样 - 使用'ast' – dawg

回答

3

这应该与ast完成,我没有看到使用正则表达式匹配if语句的要点。

我当然不推荐在这里使用正则表达式。但是,它可以用正则表达式来完成。这个想法是捕获用于缩进if声明的空间,并使用反向引用\1来在下面的行中要求相同的缩进和至少一个空格。

以下正则表达式将涵盖最简单的语句。例如,使用多行三引号字符串会失败。你可以从这里工作吧:

pattern = re.compile(r''' 
    #if statement (group 1 captures the indentation) 
    ^([ \t]*) if\b .* $ 

    #code 
    (?: 
     #comments with any indentation 
     (?: 
      \s*? 
      \n [ \t]* [#].* 
     )* 

     #Optional elif/else lines 
     (?: 
      \s*? 
      \n\1 el(?:se|if)\b .* $ 
     )? 

     #following lines with more indentation 
     \s*? 
     \n\1 [ \t] .* 
    )* 

    \n? #last newline char 
''', re.MULTILINE | re.VERBOSE) 

regex101 demoideone demo


注:这种表达也可以用来匹配任何声明。例如,要匹配while循环,只需将if替换为while,然后删除elif子表达式。 demo