Я встречаюсь с запутанными и, казалось бы, противоречивыми правилами относительно сырых строк. Рассмотрим следующий пример:Raw Strings, Python и re, Normal vs Special Characters
>>> text = 'm\n' >>> match = re.search('m\n', text) >>> print match.group() m >>> print text m
Это работает, и это нормально.
>>> text = 'm\n' >>> match = re.search(r'm\n', text) >>> print match.group() m >>> print text m
Снова это работает. Но разве это не должно вызывать ошибку, потому что необработанная строка содержит символы m\n
, а фактический текст содержит новую строку?
>>> text = r'm\n'
>>> match = re.search(r'm\n', text)
>>> print match.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> print text
m\n
Вышеприведенное выше, вызывает ошибку, хотя обе являются исходными строками. Это означает, что оба содержат только текст m\n
без новых строк.
>>> text = r'm\n'
>>> match = re.search(r'm\\n', text)
>>> print text
m\n
>>> print match.group()
m\n
Вышеупомянутые работы, на удивление. Почему мне приходится скрывать обратную косую черту в re.search, но не в самом тексте?
Тогда есть обратный слэш с нормальными символами, которые не имеют никакого особого поведения:
>>> text = 'm\&'
>>> match = re.search('m\&', text)
>>> print text
m\&
>>> print match.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
Это не соответствует, хотя и шаблону, и строка не имеют специальные символы.
В этой ситуации никакая комбинация сырых строк не работает (текст как необработанная строка, паттерны как необработанная строка, обе или ни одна).
Однако рассмотрим последний пример. Выход из текстовой переменной, 'm\\&'
, не работает, но экранирование в шаблоне делает. Это соответствует поведение выше - даже незнакомым, я чувствую, учитывая, что \&
не представляет особого смысла либо Python или Re:
>>> text = 'm\&'
>>> match = re.search(r'm\\&', text)
>>> print text
m\&
>>> print match.group()
m\&
Мое понимание исходных строк в том, что они подавляют поведение обратной косой черты в питона , Для регулярных выражений это важно, поскольку позволяет re.search применять свое внутреннее поведение обратной косой черты и предотвращать конфликты с Python. Однако в ситуациях, подобных выше, где обратная косая черта фактически ничего не значит, я не уверен, почему это кажется необходимым. Хуже того, я не понимаю, почему мне нужно обратное слэш для шаблона, но не текст, и когда я делаю как необработанную строку, это, похоже, не работает.
The docs не дают большого руководства в этом отношении. Они сосредоточены на примерах с очевидными проблемами, такими как '\section'
, где \s
является метасимволом. Ищете полный ответ, чтобы предотвратить непредвиденное поведение, такое как это.
Нечего удивляться. 'r'm \ n' имеет длину 3 (' m', '' '' ',' n'). Регулярное выражение 'r'm \ n'' соответствует 2 строкам символов,' m' + newline. –
Это делает ваш вопрос обманом http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean. «R» \ n'' - это шаблон соответствия LF. –