Исходные строки Python и обратная косая черта

Я когда-то сталкивался с чем-то и задавался вопросом, была ли это "ошибка" на Python или, по крайней мере, ошибка. Мне любопытно, если кто-нибудь знает какие-либо оправдания такого поведения. Я подумал об этом, просто прочитав "Code Like a Pythonista", который до сих пор был приятным. Я знаю только строку 2.x Python.

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

Так здорово! Если, конечно, вы действительно хотите, чтобы ваша строка закончилась обратным слэшем. Нет способа сделать это в "сырой" строке.

In [9]: r'\n'
Out[9]: '\\n'

In [10]: r'abc\n'
Out[10]: 'abc\\n'

In [11]: r'abc\'
------------------------------------------------
   File "<ipython console>", line 1
     r'abc\'
           ^
SyntaxError: EOL while scanning string literal


In [12]: r'abc\\'
Out[12]: 'abc\\\\'

Итак, одна обратная косая черта перед закрывающей цитатой - это ошибка, но две обратные косые черты дают вам две обратные косые черты! Конечно, я не единственный, кого это беспокоит?

Мысли о том, почему "сырые" строки являются "сырыми", за исключением обратной косой черты? Я имею в виду, если бы я хотел включить одну цитату, я бы просто использовал двойные кавычки вокруг строки и наоборот. Если бы я хотел обоим, я бы просто тройной цитатой. Если бы я действительно хотел три кавычки подряд в исходной строке, ну, я думаю, мне придется иметь дело, но считается ли это правильное поведение?

Это особенно проблематично с именами папок в Windows, где обратная косая черта - это дорожный разделитель.

Ответ 1

Это FAQ.

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

>>> r'ab\c' '\\' == 'ab\\c\\'
True
>>>

Ответ 2

Необработанные строки предназначены главным образом для удобного написания шаблонов для регулярных выражений, которые никогда не нуждаются в обратной обратной косой чертой; это случайно, что они могут пригодиться для Windows (в любом случае вы можете использовать косые черты в большинстве случаев - библиотека Microsoft C, которая лежит в основе Python, принимает любую форму!). Нельзя считать приемлемым сделать (почти) невозможным написать шаблон регулярного выражения, содержащий как одинарные, так и двойные кавычки, только для того, чтобы укрепить ситуацию, о которой идет речь.

( "Почти", потому что тройное цитирование почти всегда помогает... но иногда это может быть немного больно).

Итак, да, исходные строки были предназначены для того, чтобы вести себя таким образом (запрещающие нечетные числа конечных обратных косых черт), и считается безупречным "правильным поведением", чтобы они уважали дизайнерские решения, сделанные Guido, когда он придумал их, -).

Ответ 3

Другим способом решения этой проблемы является:

 >>> print r"Raw \with\ trailing backslash\\"[:-1]
 Raw \with\ trailing backslash\

Ответ 4

Мысли о том, почему "сырые" строки являются "сырыми", за исключением обратной косой черты? я Если бы я захотел вставить одну цитату, я бы просто использовал двойной цитаты вокруг строки и наоборот.

Но тогда возник бы вопрос о том, почему необработанные строки являются "сырыми, за исключением встроенных кавычек?"

У вас должен быть механизм эвакуации, иначе вы никогда не сможете использовать внешние символы кавычек внутри строки. И тогда вам нужен механизм эвакуации для механизма эвакуации.