строковые escape-символы

#python #string

#python #строка

Вопрос:

Может кто-нибудь объяснить следующее:

 In [9]: str( """w'o"w""") 
Out[9]: 'w'o"w'
  

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

 In [10]: print ( 'w'o"w') 
w'o"w

In [11]: print ( 'w'o"w') 
w'o"w
  

И в следующих двух случаях выхода нет:

 In [12]: str( """w'o'w""")
Out[12]: "w'o'w"

In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
  

но они по-прежнему эквивалентны их с escape-версиями:

 In [14]: str("w'o'w")
Out[14]: "w'o'w"

In [15]: str( "w"o"w") 
Out[15]: 'w"o"w'
  

Может кто-нибудь объяснить мне, почему у Python есть это «несоответствие»? Каковы преимущества их наличия?

Комментарии:

1. Можете ли вы уточнить, о чем вы спрашиваете? Ваш вопрос, почему значения отображаются такими, какие они есть, или ваш вопрос, почему ввод строки с экранированием или без него не изменяет ее значение?

2. на мой вопрос отлично отвечает первый абзац @rmunn .

Ответ №1:

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

Что касается того, что происходит с print() вызовами — они не печатают repr() строку, они показывают str() значение этой строки, которая является самой строкой без добавления экранирования обратной косой черты (и без кавычек вокруг нее).

Итак, вот что происходит в каждом из ваших примеров:

 In [9]: str( """w'o"w""") 
Out[9]: 'w'o"w'
  

Вы получаете значение строки w'o"w , а IPython отображает значение на выходе. Таким образом, он вызывает repr() значение, которое заключает его в кавычки и обратную косую черту внутри него.

 In [10]: print ( 'w'o"w') 
w'o"w
  

Вы печатаете строку w'o"w , а не получаете ее значение. Итак, IPython отображает напечатанную строку. Обратите внимание, что Out[10] функция не print() возвращает — None , и IPython подавляет выходные значения, когда они есть None .

 In [11]: print ( 'w'o"w') 
w'o"w
  

То же самое и здесь: вы печатаете строку, а не IPython показывает вам значение. Поэтому он использует str() , а не repr() .

 In [12]: str( """w'o'w""")
Out[12]: "w'o'w"
  

Здесь вы показываете значение строки, поэтому оно заключено в кавычки. Но никаких обратных косых черт, поскольку они не нужны для представления строки.

 In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
  

То же самое здесь: никаких обратных косых черт, поскольку они не нужны для представления строки.

 In [14]: str("w'o'w")
Out[14]: "w'o'w"
  

То же самое здесь: никаких обратных косых черт в repr() выходных данных, поскольку они не нужны для представления строки.

 In [15]: str( "w"o"w") 
Out[15]: 'w"o"w'
  

И то же самое здесь: никаких обратных косых черт в repr() выходных данных, поскольку они не нужны для представления строки.

Я надеюсь, что это поможет вам немного лучше понять, что происходит.

Ответ №2:

Когда вы заключаете строку в single quotes , вам нужно экранировать single quotes внутри строки — иначе как интерпретатор узнает, должна ли строка заканчиваться или нет?

И наоборот, когда вы заключаете строку с double quotes помощью, вам нужно экранировать double quotes внутри строки.

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

Ответ №3:

Единственная причина, по которой вам нужно экранировать начальный / конечный символ строки, заключается в том, что компилятор / интерпретатор знает, что этот символ не означает начало / конец области строки.

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