Jak dołączyć cytat do nieprzetworzonego ciągu znaków w języku Python

89

Rozważać:

>>> r"what"ever"
SyntaxError: invalid syntax
>>> r"what\"ever"
'what\\"ever'

Jak więc otrzymamy cytat, ale nie ukośnik?

I proszę nie sugerować r'what"ever', ponieważ wtedy pojawia się pytanie, w jaki sposób uwzględniamy oba rodzaje cytatów?

Związane z

mpen
źródło
W motywującym przypadku użycia dla nieprzetworzonych ciągów (wyrażeń regularnych i innych przypadków, w których coś innego niż Python interpretuje ukośniki odwrotne), ukośnik odwrotny jest w porządku, ponieważ będzie przetwarzany przez silnik wyrażeń regularnych / dowolny silnik. Nie dotyczy to wszystkich przypadków, w których możesz chcieć użyć nieprzetworzonych ciągów, ale pamiętaj, aby zastanowić się, czy ma to zastosowanie do twojego przypadku użycia, zanim spróbujesz usunąć odwrotne ukośniki.
user2357112 obsługuje Monikę

Odpowiedzi:

146

Jeśli chcesz używać podwójnych cudzysłowów w łańcuchach, ale nie pojedynczych cudzysłowów, możesz zamiast tego użyć pojedynczych cudzysłowów jako separatora:

r'what"ever'

Jeśli potrzebujesz obu rodzajów cudzysłowów w swoim ciągu, użyj ciągu z potrójnym cudzysłowem:

r"""what"ev'er"""

Jeśli chcesz uwzględnić oba rodzaje ciągów w potrójnym cudzysłowie (bardzo mało prawdopodobny przypadek), nie możesz tego zrobić i będziesz musiał używać nieprzetworzonych ciągów ze znakami ucieczki.

Adam Rosenfield
źródło
1
Świetny. Zajęło mi sekundę, zanim zdałem sobie sprawę, że mogę też zrobić surowe struny z potrójnymi cudzysłowami.
mpen
3
Ostatni akapit też mi się podoba ... to było dokładnie to, co próbowałem zrozumieć. Ograniczenia różnych stylów cytowania. Porównuję Pythona r"raw string"i C # @"@-quoted string"oraz"""triple quotes"""
mpen
2
Python newb tutaj, trochę zdezorientowany, czy nie jest r'what"ever"to błąd analizy? Czy miałeś na myśli r'what"ever'?
NMR
1
Co jest nie tak z programistami Python? Dlaczego po prostu nie wdrożyli systemu ucieczki, jak w każdym innym języku?
Jamby
6
@Jamby Mają system ucieczki, po prostu używasz go z nie-surowym ciągiem (ciągami bez r przed nimi) i działa jak prawie każdy inny język .
Coburn
10

Python ma więcej niż jeden sposób tworzenia łańcuchów. Poniższa składnia łańcuchów pozwala na użycie cudzysłowów:

'''what"ever'''
Karl
źródło
Przegapiłeś surową część pytania.
mpen
10

Jeśli potrzebujesz dowolnego cytowania (pojedyncze, podwójne i potrójne dla obu), możesz „połączyć” (0) ciągi:

>>> raw_string_with_quotes = r'double"' r"single'" r'''double triple""" ''' r"""single triple''' """
>>> print raw_string_with_quotes
double"single'double triple""" single triple'''

Możesz także „łączyć” (0) nieprzetworzone ciągi z nieprzetworzonymi ciągami:

>>> r'raw_string\n' 'non-raw string\n'
'raw_string\\nnon-raw string\n'

(0): W rzeczywistości parser Pythona łączy ciągi i nie tworzy wielu ciągów. Jeśli dodasz operator „+”, zostanie utworzonych i połączonych wiele ciągów.

Bakuriu
źródło
5

Nieważne, odpowiedź to nieprzetworzone ciągi w potrójnych cudzysłowach:

r"""what"ever"""
mpen
źródło
3

Ponieważ natknąłem się na tę odpowiedź i bardzo mi to pomogło, ale znalazłem drobny problem składniowy, czułem, że powinienem oszczędzić innym możliwej frustracji. Łańcuch z potrójnym cudzysłowem działa w tym scenariuszu zgodnie z opisem, ale zwróć uwagę, że jeśli „żądane słowo” występuje na końcu samego ciągu:

somestr = """This is a string with a special need to have a " in it at the end""""

Wystąpi błąd podczas wykonywania, ponieważ "" "" (4) cudzysłowy w wierszu dezorientują czytnik ciągów, ponieważ myśli, że dotarł już do końca ciągu, a następnie znajduje losowe "". Możesz to sprawdzić wstawiając spację w 4 cudzysłowy, w ten sposób: "" "" i nie będzie błędu.

W tym szczególnym przypadku będziesz musiał użyć:

somestr = 'This.....at the end"'

lub użyj metody opisanej powyżej, budując wiele ciągów z mieszanymi znakami „i”, a następnie łącząc je po fakcie.

charrold303
źródło
1

Wystarczy dołączyć nową funkcjonalność zgodną z Python f String:

var_a = 10

f"""This is my quoted variable: "{var_a}". """
illusionx
źródło
F-stringi obsługują jednak ucieczkę, prawda? Więc możesz to zrobić f"foo\"bar".
otwarte
-3

Posługiwać się:

dqote='"'
sqote="'"

Użyj operatora „+” dqotei squotezmiennych, aby uzyskać to, czego potrzebujesz.

Jeśli chcę sed -e s/",u'"/",'"/g -e s/^"u'"/"'"/, możesz spróbować następujących rzeczy:

dqote='"'
sqote="'"
cmd1="sed -e s/" + dqote + ",u'" + dqote + "/" + dqote + ",'" + dqote + '/g -e s/^"u' + sqote + dqote + '/' + dqote + sqote + dqote + '/'
zulfi123786
źródło