-3
我想开发一个正则表达式来匹配python if
语句等内的所有内容。到目前为止,我的开头匹配为':[\n][\t]'
,但我无法找出正则表达式来检测Python中if
语句的结束。到目前为止,我能想到的最好的是[\n][^\t]
,因为我知道当一个换行符没有跟随一个制表符时退出了一个块。正则表达式匹配Python中的所有内容If语句
我想开发一个正则表达式来匹配python if
语句等内的所有内容。到目前为止,我的开头匹配为':[\n][\t]'
,但我无法找出正则表达式来检测Python中if
语句的结束。到目前为止,我能想到的最好的是[\n][^\t]
,因为我知道当一个换行符没有跟随一个制表符时退出了一个块。正则表达式匹配Python中的所有内容If语句
这应该与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)
注:这种表达也可以用来匹配任何声明。例如,要匹配while循环,只需将if
替换为while
,然后删除elif
子表达式。 demo
您是否考虑过使用'ast'代替? – roippi
实际上,当缩进停止时,块将退出。标签不是必需的。 –
这在一般情况下很难。考虑评论(可能在LH边界),在这里文件只是两个困难。正如roippi所说的那样 - 使用'ast' – dawg