2013-11-18 5 views
2

следующие работы, как и ожидалось: (? Является то, что правильная терминология)Путаница избежать одиночные кавычки в одном кавычках сырым строкового литерала

>>> print re.sub('(\w)"(\W)', r"\1''\2", 'The "raw string literal" is a special case of a "string literal".') 
The "raw string literal'' is a special case of a "string literal''. 

Так как я хотел использовать одинарные кавычки в выражении замены, Я процитировал его, используя двойные кавычки.

Но для моего назидания я попытался использовать одинарные кавычки в выражении замены и не могут понять результаты:

>>> print re.sub('(\w)"(\W)', r'\1\'\'\2', 'The "raw string literal" is a special case of a "string literal".') 
The "raw string literal\'\' is a special case of a "string literal\'\'. 

не должны две формы производят точно тот же результат?

Итак, мои вопросы:

  1. Как избежать апостроф в одинарных кавычках сырой строки?
  2. Как избежать двойной кавычки в строке с двойными кавычками?
  3. Почему в первом параметре re.sub() мне не нужно было использовать необработанную строку, но во втором параметре я должен это сделать. Оба кажутся строковыми представлениями регулярных выражений для этого Python noob.

Если это имеет значение, я использую Python 2.7.5 для Mac OS X (10.9, Mavericks).

ответ

4

Нет, они не должны. Сырые строковый литерал действительно позволяет вам избежать кавычки, но будут включены обратные косые:

>>> r"\'" 
"\\'" 

где Python повторяет полученную строку в виде строки буквального с обратной косой черты убежали.

Это явно документирована поведение сырой строки буквального синтаксиса:

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

Если вы не использовали сырой строковый литерал для второго параметра, Python будет интерпретировать \digit комбинации, как восьмеричные байтовые значения:

>>> '\0' 
'\x00' 

Вы можете построить ту же строку без исходных строковых литералов с удвоение обратной косой черты:

>>> '\\1\'\'\\2' 
"\\1''\\2" 
1

Чтобы ответить на вопросы OP:

Как избежать одиночной кавычки в одной кавычной строке?

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

Как избежать двойной кавычки в строке с двойными кавычками?

См. Выше.

Почему в первом параметре re.sub() мне не нужно было использовать необработанную строку, но во втором параметре я должен это сделать. Оба кажутся строковыми представлениями регулярных выражений для этого Python noob.

Завершая ответ Мартейна (который только покрывал второй параметр): Обратный косые черты в первом параметре, пытался быть истолкованы как экранирующие символы вместе с их следующими символами, потому что строка не является сырой. Однако, поскольку следующие символы не образуют правильных escape-последовательностей вместе с обратной косой чертой, обратная косая черта интерпретируется как символ:

>>> '(\w)"(\W)' 
'(\\w)"(\\W)' 
>>> '(\t)"(\W)' 
'(\t)"(\\W)' 
Смежные вопросы