Модификатор r
строит raw строка. Он сообщает Python не преобразовывать escape-последовательности обратного слэша в специальные символы, такие как \t
или \n
, для встроенных строк. Это не имеет никакого отношения к последовательностям escape-последовательности регулярного выражения.
>>> len('\t') # tab character only
1
>>> len(r'\t') # backslach character followed by a tee
2
Однако синтаксис регулярных выражений имеет свой собственный набор правил, которые спасаясь часто конфликтовать с правилами эвакуации из встроенных строк Python. Ключевое слово r
помогает нам справляться только с одним. Например, первая строка ниже представляет собой текст регулярного выражения, который соответствует символам слов, так же как и второй, поскольку Python преобразует \\
в \
для встроенных строк, если не указано ключевое слово r
.
>>> re.compile(r'\w') == re.compile('\\w')
True
В вашем случае r'(foobar)'
в точности эквивалентно '(foobar)'
, потому что нет последовательности обратной косой черты, чтобы избежать. Эта строка является регулярным выражением текст только в вашем уме. Ключевое слово r
не говорит Python интерпретировать строку таким образом. Python знает только о регулярном выражении объектов, которые вы создаете с помощью re.compile()
или которые по своей сути скомпилированы с помощью таких методов, как re.findall()
.
Компиляция объектов регулярных выражений имеет свой собственный набор правил, отличный от встроенных правил escape-последовательности строки, а правила регулярных выражений не связаны с ключевым словом r
. Компилятор регулярных выражений не понимает его особого значения, только интерпретатор Python.
В вашем случае ключевое слово r
в "r'(foobar)'"
не имеет специального лечения, поскольку оно напрямую передается компилятору регулярных выражений. Вы эффективно создаете регулярное выражение, которое ищет строку, начинающуюся с "
, а затем r
и так далее. Вот почему два выражения отличаются друг от друга.
>>> re.compile(r'(foobar)') == re.compile('"r(foobar)"') # your expressions
False
Использование в r
ключевое слово не имеет никакого эффекта здесь:
>>> re.compile(r'(foobar)') == re.compile('(foobar)')
True
>>> re.compile(r'"r(foobar)"') == re.compile('"r(foobar)"')
True
Для получения дополнительной информации:
Awesome. Большое спасибо! – jond