Сообщить об ошибке.

Обратная косая черта в регулярных выражениях

Регулярные выражения используют символ обратной косой черты '\', чтобы указать специальные формы или разрешить использование специальных символов без вызова их специального значения. Это противоречит использованию в Python одного и того же символа для той же цели в [строковых литералах][escape-sequence].

Допустим, нужно написать регулярное выражение, соответствующее строке \section, которая может быть найдена в файле LaTeX. Чтобы выяснить, что писать в программном коде, начинаем с нужной строки, которую нужно сопоставить. Затем нужно избежать появление любых обратных и других метасимволов, поставив перед ними обратную косую черту, что приведет к появлению строки \\section. Результирующая строка, которая должна быть передана в re.compile() должна быть \\section. Тем не менее, чтобы выразить это как строковый литерал в Python, оба обратных слэша должны быть снова экранированы!

  • \section - Текстовая строка для сопоставления.
  • \\section - Избежали обратной косой черты для re.compile().
  • \\\\section - Избежали обратной косой черты для строкового литерала.

Короче говоря, чтобы сопоставить обратную косую черту литерала, нужно написать '\\\\' как строку шаблона RegExp в Python, потому что регулярное выражение должно быть \\ и каждая обратная косая черта должна быть выражена как \\ внутри обычного строкового литерала Python. Регулярные выражения которые имеют несколько обратных слешей приведет к множеству повторных обратных косых черт, что затруднит понимание результирующих шаблонов.

Решение заключается в использовании необработанной строковой нотации r'RegExp' Python для использования в регулярных выражениях. Обратная косая черта не обрабатывается каким-либо особым образом в строковом литерале с префиксом 'r', так r"\n" будет представлять двухсимвольную строку, содержащую '\' и 'n'. Регулярные выражения часто пишутся в коде Python с использованием этой необработанной строковой записи.

  • 'ab*' будет выглядеть как r'ab*'
  • '\\\\section' будет выглядеть как r'\\section'
  • '\\w+\\s+\\1' будет выглядеть как r'\w+\s+\1'