Что означает "r" в pythons re.compile(r 'pattern flags?)?
Я читаю http://docs.python.org/2/library/re.html. В соответствии с этим "r" в pythons re.compile( r "флаги шаблонов" ) относится к нотной строке:
Решение состоит в использовании нотной строки Pythons для регулярных шаблоны выражений; обратная косая черта не обрабатывается каким-либо особым образом в строковый литерал с префиксом "r". Таким образом, r "\n" является двухсимвольной строкой содержащие "\" и "n", а "\n" - односимвольная строка содержащий новую строку. Обычно шаблоны будут выражаться в Python код с использованием этой необработанной строковой нотации.
Было бы справедливым сказать, что:
re.compile(r) означает, что "шаблон" является регулярным выражением, а re.compile(pattern) означает, что "шаблон" является точным совпадением?
Ответы
Ответ 1
Как указано @PauloBu
, префикс строки r
не связан конкретно с регулярным выражением, а с строками вообще в Python.
Нормальные строки используют символ обратной косой черты в качестве символа escape для специальных символов (например, строк новой строки):
>>> print 'this is \n a test'
this is
a test
Префикс r
указывает интерпретатору не делать этого:
>>> print r'this is \n a test'
this is \n a test
>>>
Это важно в регулярных выражениях, так как вам нужна обратная косая черта, чтобы сделать его недействительным в модуле re
, в частности, \b
соответствует пустой строке, в частности, в начале и в конце слова. re
ожидает строку \b
, однако нормальная интерпретация строк '\b'
преобразуется в символ обратного пространства ASCII, поэтому вам нужно либо явно избежать обратную косую черту ('\\b'
), либо сказать, что python - это необработанная строка (r'\b'
).
>>> import re
>>> re.findall('\b', 'test') # the backslash gets consumed by the python string interpreter
[]
>>> re.findall('\\b', 'test') # backslash is explicitly escaped and is passed through to re module
['', '']
>>> re.findall(r'\b', 'test') # often this syntax is easier
['', '']
Ответ 2
Нет, поскольку вложенная документация объясняет префикс r
для строки, указывает, что строка raw string
.
Из-за столкновений между экранированием символов Python и экранированием регулярных выражений, оба из которых используют символ обратного слэша \
, необработанные строки предоставляют способ указать на python, что вы хотите создать неэкранированную строку.
Изучите следующее:
>>> "\n"
'\n'
>>> r"\n"
'\\n'
>>> print "\n"
>>> print r"\n"
\n
Префикс с r
просто указывает на строку, обратную косую черту \
следует обрабатывать буквально, а не как escape-символы для python.
Это полезно, когда, например, вы просматриваете строку слов. Регулярное выражение для этого - \b
, однако, чтобы зафиксировать это в строке Python, мне нужно использовать "\\b"
как шаблон. Вместо этого я могу использовать необработанную строку: r"\b"
для соответствия шаблону.
Это особенно удобно при попытке найти буквенную обратную косую черту в регулярном выражении. Чтобы сопоставить обратную косую черту в регулярном выражении, мне нужно использовать шаблон \\
, чтобы избежать этого в python, мне нужно избежать каждой косой черты, и шаблон становится "\\\\"
или гораздо проще r"\\"
.
Как вы можете догадаться в более длинных и более сложных регулярных выражениях, дополнительные слэши могут запутаться, поэтому исходные строки обычно считаются способными.
Ответ 3
Нет. Не все в синтаксисе regex должно предшествовать \
, поэтому .
, *
, +
и т.д. Все еще имеют особое значение в шаблоне
r''
часто используется как удобство для регулярного выражения, для которого требуется много \
, поскольку оно предотвращает беспорядок с удвоением значения \