Необработанные строки Python и завершающая обратная косая черта - PullRequest
25 голосов
/ 20 мая 2010

Однажды я наткнулся на что-то и подумал, что это за ошибка в 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,где обратный слеш - это разделитель пути.

Ответы [ 4 ]

18 голосов
/ 20 мая 2010

Это FAQ .

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

>>> r'ab\c' '\\' == 'ab\\c\\'
True
>>>
4 голосов
/ 20 мая 2010

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

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

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

3 голосов
/ 02 октября 2014

Другой способ обойти это:

 >>> print r"Raw \with\ trailing backslash\\"[:-1]
 Raw \with\ trailing backslash\
0 голосов
/ 28 октября 2011

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

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

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

...