Подтвердить что ты не робот

Чистые регулярные выражения Python

Есть ли более чистый способ записи длинных шаблонов регулярных выражений в python? Я видел этот подход где-то, но регулярное выражение в python не позволяет списки.

patterns = [
    re.compile(r'<!--([^->]|(-+[^->])|(-?>))*-{2,}>'),
    re.compile(r'\n+|\s{2}')
]
4b9b3361

Ответ 1

Вы можете использовать подробный режим для записи более читаемых регулярных выражений. В этом режиме:

  • Пробелы внутри шаблона игнорируются, за исключением случаев, когда в классе символов или предшествует обратная косая черта без возврата.
  • Когда строка содержит "#" ни в символьном классе, ни в предыдущей строке, а в конце строки игнорируются все символы из крайних левых, такие как "#" в конце строки.

Следующие два утверждения эквивалентны:

a = re.compile(r"""\d +  # the integral part
                   \.    # the decimal point
                   \d *  # some fractional digits""", re.X)

b = re.compile(r"\d+\.\d*")

(взято из документации подробный режим)

Ответ 2

Хотя предложение @Ayman о re.VERBOSE является лучшей идеей, если все, что вы хотите, это то, что вы показываете, просто выполните:

patterns = re.compile(
        r'<!--([^->]|(-+[^->])|(-?>))*-{2,}>'
        r'\n+|\s{2}'
)

и автоматическая конкатенация Python смежных строковых литералов (как и C, btw) сделает все остальное: -).

Ответ 3

Вы можете использовать комментарии в regex's, что делает их более читаемыми. Пример из http://gnosis.cx/publish/programming/regular_expressions.html:

/               # identify URLs within a text file
          [^="] # do not match URLs in IMG tags like:
                # <img src="http://mysite.com/mypic.png">
http|ftp|gopher # make sure we find a resource type
          :\/\/ # ...needs to be followed by colon-slash-slash
      [^ \n\r]+ # stuff other than space, newline, tab is in URL
    (?=[\s\.,]) # assert: followed by whitespace/period/comma 
/