Почему необработанные строковые литералы Python не могут заканчиваться одной обратной косой чертой?



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



>>> 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


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

694   11  

11 ответов:

причина объясняется в той части этого раздела, которую я выделил жирным шрифтом:

строковые кавычки можно экранировать с помощью обратная косая черта, но обратная косая черта остается в строке; например, r"\"" - Это допустимый строковый литерал, состоящий из двух символы: косая черта и двойной цитата; r"\" не является допустимой строкой литерал (даже необработанная строка не может заканчиваться в нечетном количестве обратных косых черт). В частности, необработанная строка не может заканчиваться в одиночная обратная косая черта (так как обратная косая черта избежала бы следующего символ кавычки.) Отметим также, что одна обратная косая черта, за которой следует новая строка интерпретируется как эти два символа как часть строки, а не строки продолжение.

таким образом, необработанные строки не являются 100% необработанными, все еще существует некоторая рудиментарная обратная косая черта.

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

, когдаr' или 'R' префикс присутствует, символ после a обратная косая черта включается в строку без изменения, и все обратные слэши в строке

Так что любой символ после обратной косой черты и часть "сырые" строки. Как только парсер вводит необработанную строку (не unicode one) и встречает обратную косую черту, он знает, что есть 2 символа (обратная косая черта и символ после нее).

таким образом:

Р'abc\д' включает в себя a, b, c,\, d

Р'abc\'д' включает в себя a, b, c,\,', d

Р'abc\" включает в себя a, b, c,\,'

и:

Р'abc\' включает в себя a, b, c,\,' но сейчас нет конечной цитаты.

последний случай показывает, что в соответствии с документацией теперь парсер не может найти закрывающую цитату, поскольку последний qoute, который вы видите выше, является частью строки ie. обратная косая черта не может быть последней здесь, так как она будет "пожирать" строку, закрывающую символ.

так оно и есть! Я вижу это как один из тех небольших дефектов в python!

Я не думаю, что для этого есть веская причина, но это определенно не разбор; очень легко разобрать необработанные строки С \ в качестве последнего символа.

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

этот не должно быть никаких проблем.

если вы беспокоитесь о том, что не сможете легко писать папки Windows, такие какc:\mypath\ тогда не беспокойтесь, ибо, вы можете представить их как r"C:\mypath", и, если вам нужно добавить имя подкаталога, не делайте этого с конкатенацией строк, потому что это не правильный способ сделать это в любом случае! используйте os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\mypath\subfolder'

еще один трюк-использовать chr (92), поскольку он оценивает "\".

недавно мне пришлось очистить строку обратных косых черт, и следующее сделало трюк:

CleanString = DirtyString.replace(chr(92),'')

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

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

>>> print r"c:\test"'\'
test\

Так как \ " допускается внутри необработанной строки. Тогда он не может быть использован для идентификации конца строкового литерала.

Почему бы не прекратить разбор строкового литерала, когда вы сталкиваетесь с первым "?

Если бы это было так, то \" не было бы разрешено внутри строкового литерала. Но это так.

причина r'\' синтаксически неверно, что хотя строковое выражение является необработанным, используемые кавычки (одинарные или двойные) всегда должны быть escape, так как в противном случае они будут отмечать конец цитаты. Поэтому, если вы хотите выразить одну кавычку внутри одной строки в кавычках, нет другого способа, кроме использования \'. То же самое относится и к двойным кавычкам.

но вы могли бы использовать:

'\'

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

Я подумал, что это интересная идея, и включаю ее в качестве сообщества wiki для потомков.

coming from C мне довольно ясно, что один \ работает как escape-символ, позволяющий помещать специальные символы, такие как новые строки, вкладки и кавычки в строки.

Это действительно запрещает \ как последний символ, так как он будет избегать " и заставить парсер задохнуться. Но, как указывалось ранее \ является законным.

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

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

1)Если вам нужно манипулировать обратной косой чертой для пути, то стандартная ОС модуля python.путь - это твой друг. например :

ОС.путь.normpath('c:/folder1/')

2) Если вы хотите построить строки с обратной косой чертой в нем, но без обратной косой черты в конце строки, то raw string-ваш друг (используйте префикс '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

Comments

    Ничего не найдено.