Почему необработанные строковые литералы Python не могут заканчиваться одним обратным слешем? - PullRequest
144 голосов
/ 15 марта 2009

Технически, любое нечетное количество обратной косой черты, как описано в документах .

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

Кажется, что синтаксический анализатор может просто рассматривать обратные слэши в необработанных строках как обычные символы (разве не в этом смысл необработанных строк?), Но я, вероятно, упускаю что-то очевидное. ТИА!

Ответы [ 12 ]

0 голосов
/ 10 октября 2018

Я столкнулся с этой проблемой и нашел частичное решение, которое подходит для некоторых случаев. Несмотря на то, что python не может завершить строку одним обратным слешем, он может быть сериализован и сохранен в текстовом файле с одним обратным слешем в конце. Поэтому, если вам нужно сохранить текст с одной обратной косой чертой на вашем компьютере, это возможно:

x = 'a string\\' 
x
'a string\\' 

# Now save it in a text file and it will appear with a single backslash:

with open("my_file.txt", 'w') as h:
    h.write(x)

Кстати, он не работает с json, если вы выгрузите его с помощью библиотеки json в python.

Наконец, я работаю со Spyder и заметил, что если я открою переменную в текстовом редакторе spider, дважды щелкнув ее имя в проводнике переменных, она будет отображаться с одной обратной косой чертой и может быть скопирована в буфер обмена (это не очень полезно для большинства потребностей, но может быть для некоторых ..).

0 голосов
/ 16 марта 2009

несколько советов:

1) если вам нужно манипулировать обратной косой чертой для пути, то стандартный модуль python os.path - ваш друг. например:

os.path.normpath ( 'C: / folder1 /')

2) если вы хотите построить строки с обратной косой чертой в нем, НО без обратной косой черты в конце вашей строки, тогда raw строка является вашим другом (используйте префикс 'r' перед вашей литеральной строкой). например:

r'\one \two \three'

3) если вам нужно поставить строку в переменной X с обратной косой чертой, то вы можете сделать это:

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4) если вам нужно создать строку с обратной косой чертой в конце, объедините подсказки 2 и 3:

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

теперь lilypond_statement содержит "\DisplayLilyMusic \upper"

Да здравствует питон! :)

n3on

...