2012-04-27 2 views
3

Я очень новый для регулярного выражения и пытаемся получить «\» характер с помощью PythonКак избежать «» символов в питоне

обычно я могу избежать «\», как этого

print ("\\"); 
print ("i am \\nit"); 

выхода

\ 
i am \nit 

но когда я использую то же самое в regX он не работает, как я думал

print (re.findall(r'\\',"i am \\nit")); 

и вернуть мне выход

['\\'] 

может кто-то пожалуйста, объясните, почему

+14

Неплохая практика использования точек с запятой в python. – jamylak

+0

Тот же вопрос, вопрос и ответ как [http://stackoverflow.com/questions/647769/why-cant-pythons-raw-string-literals-end-with-a-single-backslash][1] [1]: http://stackoverflow.com/questions/647769/why-cant-pythons-raw-string-literals-end-with-a-single-backslash – Boud

ответ

12

EDIT: проблема фактически как print работы со списками & строк. Он печатает представление строки, а не самой строки, представление строки, содержащей только обратную косую черту, равно '\\'. Таким образом, findall на самом деле находит одиночную обратную косую черту правильно, но print не печатает ее, как вы ожидали. Попробуйте:

>>> print(re.findall(r'\\',"i am \\nit")[0]) 
\ 

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

r префикса на строке означает, что строка находится в режиме„сырого“, то есть, \ не рассматривается как специальные символов (это не имеет ничего общего с„регулярным выражением“).

Однако r'\' не работает, так как вы не можете закончить необработанную строку с обратным косой чертой it's stated in the docs:

Even in a raw string, string quotes can be escaped with a backslash, but the backslash remains in the string; for example, r"\"" is a valid string literal consisting of two characters: a backslash and a double quote; r"\" is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character).

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

+0

В Python 2.7 're.compilte (" \\ ")' дает ошибку 'error: bogus escape (конец строки)'. –

+0

Чтобы сопоставить фактическую обратную косую черту с помощью регулярного выражения, вам нужно две обратные косые черты в регулярном выражении, затем снова две обратные слэши, чтобы избежать этих: 're.compile (" \\\\ ")' создает регулярное выражение, которое соответствует одному обратному косую черту. –

+0

@ LimboPeng, я бы неправильно прочитал вопрос, поэтому мой первоначальный ответ был неправильным. – huon

-1

Излишне избежать обратной косой черты в сырых строках, если обратный слэш сразу не предшествует закрывающую кавычку.

+3

-1 Необработанные строки не могут заканчиваться unescaped \ in Python. – Fenikso

0

Обратите внимание, что здесь вы используете два разных типа строкового литерала - есть регулярная строка "a string" и необработанная строка r"a raw string". Регулярные строковые литералы отслеживают обратную косую черту, поэтому, чтобы на самом деле поставить обратную косую черту в строке, вам тоже нужно ее избежать. Необработанные строковые литералы обрабатывают обратную косую черту, как и любой другой символ, поэтому вы более ограничены в том, какие символы вы можете на самом деле помещать в строку (никаких специальных функций, которые требуют кода эвакуации), но легче вводить такие вещи, как регулярные выражения, потому что вы не необходимо удвоить обратную косую черту, если вам нужно добавить обратную косую черту, чтобы иметь смысл внутри строки, а не только при создании строки.

1

can someone please explain why

Поскольку re.findall нашел один матч, а текст матч состоял из обратной косой черты. Он дал вам список с одним элементом, который представляет собой строку, которая имеет один символ, который является обратным слэшем.

Это написано ['\\'] потому '\\' как вы пишете «строку с одной обратной косой черты» - так же, как вы должны были сделать, когда вы написали пример кода print "\\".

Смежные вопросы