модуль re — что такое обозначение r?

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь понять этот код:

 Var1 = re.compile(r"nothing is (d )").search
  

я хочу посмотреть, как влияет обозначение r сразу после ( знака на d.
я знаю, что d означает поиск десятичных чисел ( означает, что d имеет особое значение), означает ли это, что без обозначения r я бы использовал ? если да, то почему?
я знаю, что в оболочке bash достаточно поместить только одно .

я прочитал здесь:http://docs.python.org/library/re.html#raw-string-notation

но я не могу понять, как это влияет на приведенный выше фрагмент кода. Спасибо.

Комментарии:

1. Ваш пример кода кажется неполным. Это вся строка?

2. вы правы, это должно быть в переменной, но, кроме того, это целая строка.

Ответ №1:

Это необработанный строковый литерал. Он изменяет обратную косую черту, чтобы она обрабатывалась буквально (почти, см. Ниже). Это особенно полезно при написании регулярных выражений, поскольку они часто содержат обратную косую черту, и если вы используете обычный строковый литерал, вам, возможно, придется избегать обратной косой черты, что затрудняет чтение регулярного выражения.

Без r ваш код выглядел бы так:

 f = re.compile("nothing is (\d )").search
  

Обратите внимание, что отсутствие обратной косой черты также работает в этом случае, потому что 'd' это недопустимая escape-последовательность:

 f = re.compile("nothing is (d )").search
  

Однако использование такого поведения может привести к ошибкам, если вы (и все, кто должен поддерживать ваш код) не сможете запомнить список допустимых escape-последовательностей.


Правила для необработанных строковых литералов таковы:

Когда присутствует префикс 'r' или 'R' , символ, следующий за обратной косой чертой, включается в строку без изменений, и все обратные косые черты остаются в строке. Например, строковый литерал r"n" состоит из двух символов: обратной косой черты и нижнего регистра 'n' . Строковые кавычки можно экранировать обратной косой чертой, но обратная косая черта остается в строке; например, r""" является допустимым строковым литералом, состоящим из двух символов: обратной косой черты и двойной кавычки; r"" не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт). В частности, необработанная строка не может заканчиваться одной обратной косой чертой (поскольку обратная косая черта экранирует следующий символ кавычки). Обратите также внимание, что одна обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа как часть строки, а не как продолжение строки.

Комментарии:

1. Вау, не понял, что мы не можем сделать одну обратную косую черту ( r'' ) в необработанном строковом литерале.

2. Какой дурацкий особый случай — какой цели может служить разрешение экранирования символа кавычки в необработанной строке? Невозможно создать необработанную строку, содержащую — Боб сказал «привет» — когда строка заключена в двойные кавычки, потому что обратная косая черта не отбрасывается. — Боб сказал «привет» — бесполезный результат.

3. @Dave: Вот почему вы обычно не экранируете кавычки в Python, вы пишете 'Bob said "hi"' или """Bob said "hi"""" или '''Bob said "hi"''' .

4. насколько я понимаю, вам не нужно экранировать d, потому что он интерпретируется как десятичный знак, но с ‘r’ на самом деле \ d ? если да, то почему оно не интерпретируется как буквальное » d»?

5. @HananN.: Нет. Вам не нужно экранировать d , потому что это недопустимая escape-последовательность, поэтому она обрабатывается буквально.

Ответ №2:

Не имеет ничего общего с re .

Строковые литералы Python могут начинаться с r ; они называются «необработанными строками», а экранирование обратной косой черты (в основном) не интерпретируется.