Jak pisać literały łańcuchowe w Pythonie bez konieczności ucieczki przed nimi?

101

Czy istnieje sposób na zadeklarowanie zmiennej łańcuchowej w Pythonie w taki sposób, że wszystko w niej jest automatycznie zastępowane lub ma wartość literału?

Ja nie pytając, jak uciec cytaty z ukośniki, to oczywiste. To, o co proszę, to ogólny sposób na zrobienie wszystkiego dosłownie w łańcuchu, tak żebym nie musiał ręcznie przechodzić przez wszystko i uciekać przed bardzo dużymi łańcuchami. Czy ktoś zna rozwiązanie? Dzięki!

kjakeb
źródło

Odpowiedzi:

129

Surowe literały ciągów:

>>> r'abc\dev\t'
'abc\\dev\\t'
SilentGhost
źródło
72

Jeśli masz do czynienia z bardzo dużymi ciągami, w szczególności wielowierszowymi, pamiętaj o składni potrójnego cudzysłowu :

a = r"""This is a multiline string
with more than one line
in the source code."""
Greg Hewgill
źródło
1
Czy ta konstrukcja wprowadza znaki końca wiersza? To znaczy, że zmienna abędzie zawierała ciąg z dwoma znakami podziału wiersza?
MadPhysicist
7
@MadPhysicist: Tak, wynikowy ciąg będzie zawierał dwie nowe linie w powyższym przypadku.
Greg Hewgill
Zrozumiany. A jeśli w tym ciągu zostanie użyta metoda „split ()”, czy będzie ona domyślnie dzielona według linii?
MadPhysicist
1
@MadPhysicist Domyślnie dla .split () jest dzielony znakami spacji, a nowe linie są białymi znakami.
Greg Hewgill
1
Używałem tego wcześniej i działa dobrze. Należy pamiętać o dwóch rzeczach: uwzględniono wcięcia (spacje) w pozostałych wierszach, co jest pożądane; jeśli zdarzy się, że długi ciąg zostanie zakończony "bez dobra, ponieważ cała rzecz zakończy się """" błędem składniowym.
Nagev
9

Nie ma takiej rzeczy. Wygląda na to, że potrzebujesz czegoś takiego jak „tutaj dokumenty” w Perlu i powłokach, ale Python tego nie ma.

Używanie nieprzetworzonych ciągów lub ciągów wielowierszowych oznacza tylko, że jest mniej rzeczy, o które należy się martwić. Jeśli używasz nieprzetworzonego ciągu znaków, nadal musisz obejść terminal "\", a przy każdym rozwiązaniu typu string będziesz musiał martwić się o zamknięcie ", ',"' 'lub "" ", jeśli jest zawarte w twoich danych .

Oznacza to, że nie ma sposobu, aby mieć ciąg

 '   ''' """  " \

poprawnie przechowywane w dowolnym literale ciągu Pythona bez jakiegoś wewnętrznego znaku ucieczki.

Andrew Dalke
źródło
1

(Zakładając, że nie musisz wprowadzać ciągu bezpośrednio z kodu Pythona)

aby obejść problem wskazany przez Andrew Dalke, wystarczy wpisać dosłowny ciąg znaków do pliku tekstowego, a następnie użyć go;

input_ = '/directory_of_text_file/your_text_file.txt' 
input_open   = open(input_,'r+')
input_string = input_open.read()

print input_string

Spowoduje to wydrukowanie dosłownego tekstu wszystkiego, co jest w pliku tekstowym, nawet jeśli tak jest;

 '   ''' """  “ \

Nie jest to zabawne ani optymalne, ale może być przydatne, zwłaszcza jeśli masz 3 strony kodu, które wymagałyby ucieczki znaków.

Jeff Hykin
źródło
-1

jeśli ciąg jest zmienną, użyj. metoda repr na nim:

>>> s = '\tgherkin\n'

>>> s
'\tgherkin\n'

>>> print(s)
    gherkin

>>> print(s.__repr__())
'\tgherkin\n'
oznakowanie
źródło
Czy to jednak nie jest uważane za zły styl?
shah.shah
co, korniszony?
znakowanie
1
możesz użyć repr(s)zamiast tego dla lepszego stylu
xuiqzy