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

Что означает "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) означает, что "шаблон" является точным совпадением?

4b9b3361

Ответ 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'' часто используется как удобство для регулярного выражения, для которого требуется много \, поскольку оно предотвращает беспорядок с удвоением значения \