'...'
, "..."
Pythonban, ha ezeket a string literálokat a következő karakterek egyikével előlegezi meg, az érték az escape-szekvencia kibontása nélkül is string lesz.
r
R
Hasznos, ha olyan karakterláncokat kezelünk, amelyek sok backslashes karakterláncot használnak, mint például a Windows útvonalak és a reguláris kifejezések mintái.
A következő információk itt találhatók.
- menekülési szekvencia
- A nyers karakterláncokban lévő escape szekvenciák figyelmen kívül hagyása (letiltása)
- Normál karakterlánc átalakítása nyers karakterlánccá:
repr()
- Figyelje meg a backslash-t a végén.
menekülési szekvencia
A Pythonban a normál karakterláncban nem ábrázolható karakterek (például tabulátorok és újsorok) a C nyelvhez hasonlóan backslashes escape szekvenciákkal írhatók le. Az alábbiakban egy escape-szekvencia példája látható.
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
A nyers karakterláncokban lévő escape szekvenciák figyelmen kívül hagyása (letiltása)
'...'
, "..."
Ha egy ilyen string literál elé a következők valamelyikét illesztjük, az érték az escape-szekvencia kibontása nélkül is stringgé válik. Az ilyen karakterláncot nyers karakterláncnak nevezzük.
r
R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB
Nincs speciális, nyers karakterlánc típus, ez csak egy karakterlánc típus, és megegyezik egy normál karakterlánccal egy backslash-szel, a következőképpen ábrázolva\\
print(type(rs))
# <class 'str'>
print(rs == 'a\\tb\\nA\\tB')
# True
Egy normál karakterláncban egy escape-sorozat egy karakternek számít, de egy nyers karakterláncban a backslashek is karaktereknek számítanak. A karakterlánc és az egyes karakterek hossza a következő.
print(len(s))
# 7
print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']
print(len(rs))
# 10
print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']
Windows útvonal
A nyers karakterlánc használata akkor hasznos, ha egy Windows-útvonalat karakterláncként szeretne ábrázolni.
A Windows útvonalakat backslash-ek választják el, így ha normál karakterláncot használsz, akkor az alábbi módon kell az útvonalat elkerülnöd, de ha nyers karakterláncot használsz, akkor úgy írhatod, ahogy van. Az értékek egyenértékűek.\\
path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True
Vegye figyelembe, hogy a páratlan számú backslashes karakterlánc hibát eredményez, ahogyan azt az alábbiakban leírtuk. Ebben az esetben a karakterláncot normál karakterláncként kell kiírni, vagy úgy kell összefűzni, hogy csak a karakterlánc végét írjuk ki normál karakterláncként.
path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True
Normál karakterláncok átalakítása nyers karakterláncokká repr() segítségével
Ha egy normál karakterláncot nyers karakterlánccá akarsz alakítani, figyelmen kívül hagyva (letiltva) az escape szekvenciákat, használhatod a beépített repr() függvényt.
s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'
A repr() egy objektumot reprezentáló karakterláncot ad vissza, amely ugyanazt az értéket tartalmazza, mint amikor az eval()-nek átadtuk, a vezető és az utolsó karakterekkel együtt.
print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]
A szeletek használatával a nyers karakterlánccal egyenértékű karakterláncot kapunk, amelyhez r-t csatoltunk.
s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB
print(s_r2 == rs)
# True
print(r'\t' == repr('\t')[1:-1])
# True
Figyelje meg a backslash-t a végén.
Mivel a backslash elűzi a közvetlenül utána következő idézőjelet, hiba lép fel, ha a karakterlánc végén páratlan számú backslash van. A páros számú backslashes rendben van.
# print(r'\')
# SyntaxError: EOL while scanning string literal
print(r'\\')
# \\
# print(r'\\\')
# SyntaxError: EOL while scanning string literal