2015-11-07 3 views
-3

Я пытаюсь разработать регулярное выражение, которое будет соответствовать всем в инструкции python if и тому подобное. До сих пор у меня начальное совпадение как ':[\n][\t]', но я не могу вычислить регулярное выражение, чтобы обнаружить закрытие оператора if в python. Пока лучшее, что я мог придумать, это [\n][^\t], потому что я знаю, что блок выходит, когда новая строка не следует за вкладкой.Regex Matching Everything Within Python If Statement

+2

Вы считали использование 'ast' вместо этого? – roippi

+0

На самом деле, блок выходит, когда отступы опускаются. Вкладки не требуются. –

+0

Это сложно в общем случае. Рассмотрите комментарии (которые могут быть на границе LH), и здесь документы как две трудности среди многих. Как состояния roippi - используйте 'ast' – dawg

ответ

3

Это должно быть сделано с ast, и я не вижу смысла использовать регулярное выражение для соответствия выражению if.

Я, конечно, не рекомендую использовать regex здесь. Однако это можно сделать с помощью регулярного выражения. Идея состоит в том, чтобы захватить пробелы, используемые для отступов объявления if, и использовать обратную ссылку \1, чтобы потребовать такой же отступ и, по меньшей мере, еще одно место в следующих строках.

Следующее regex - пример, который будет охватывать самые простые утверждения. Например, он будет терпеть неудачу с многострочными тройными кавычками. Вы можете работать его здесь:

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


Примечание: Это выражение также может быть использован, чтобы соответствовать любое заявление. Например, чтобы совпадать с циклами, просто замените if на while и удалите подвыражение elif. demo