Ignorowanie (wyłączanie) sekwencji ucieczki w Pythonie z nieprzetworzonymi ciągami znaków

Biznes

'...', "..."W Pythonie, jeśli poprzedzisz te literały łańcuchowe jednym z poniższych znaków, wartość stanie się łańcuchem bez rozwijania sekwencji ucieczki.

  • r
  • R

Przydatne, gdy mamy do czynienia z ciągami, które używają wielu backslashes, takich jak ścieżki Windows i wzorce wyrażeń regularnych.
Podane są tu następujące informacje.

  • sekwencja ucieczki
  • Ignoruj (wyłącz) sekwencje ucieczki w surowych łańcuchach.
  • Konwertuj normalny ciąg znaków na nieprzetworzony ciąg znaków:repr()
  • Zwróć uwagę na odwrotny ukośnik na końcu.

sekwencja ucieczki

W Pythonie znaki, które nie mogą być reprezentowane w normalnym łańcuchu (takie jak tabulatory i nowe linie) są opisywane za pomocą sekwencji ucieczki z odwrotnymi ukośnikami, podobnie jak w języku C. Przykład sekwencji ucieczki jest pokazany poniżej.

  • \t
  • \n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B

Ignoruj (wyłącz) sekwencje ucieczki w surowych łańcuchach.

'...', "..."Jeśli poprzedzisz taki literał łańcuchowy jednym z poniższych, to wartość stanie się łańcuchem bez rozwijania sekwencji ucieczki. Taki łańcuch jest nazywany łańcuchem surowym.

  • r
  • R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB

Nie ma specjalnego typu zwanego typem surowego łańcucha, jest to po prostu typ łańcucha i jest równy normalnemu łańcuchowi z odwrotnym ukośnikiem, reprezentowanemu w następujący sposób
\\

print(type(rs))
# <class 'str'>

print(rs == 'a\\tb\\nA\\tB')
# True

W normalnym łańcuchu, sekwencja ucieczki jest uważana za jeden znak, ale w surowym łańcuchu, odwrotne ukośniki są również liczone jako znaki. Długość łańcucha i każdego znaku jest następująca.

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

Ścieżka Windows

Użycie surowego łańcucha jest przydatne, gdy chcesz reprezentować ścieżkę Windows jako ciąg znaków.

Ścieżki w systemie Windows są oddzielone backslashem, więc jeśli używasz normalnego łańcucha, musisz uciec od ścieżki w następujący sposób, ale jeśli używasz surowego łańcucha, możesz napisać go tak jak jest. Wartości są równoważne.
\\

path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True

Zauważ, że łańcuch zakończony nieparzystą liczbą backslashes spowoduje błąd, jak opisano poniżej. W tym przypadku jest konieczne zapisanie łańcucha jako normalny łańcuch lub jego konkatenacja przez zapisanie tylko końca łańcucha jako normalnego łańcucha.

path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True

Konwertuj normalne ciągi znaków na surowe ciągi znaków za pomocą repr()

Jeśli chcesz przekonwertować normalny łańcuch na surowy łańcuch ignorując (wyłączając) sekwencje escape, możesz użyć wbudowanej funkcji repr().

s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'

To co zwraca repr() to łańcuch reprezentujący obiekt taki, że ma on taką samą wartość jak wtedy, gdy został przekazany do eval(), ze znakami wiodącymi i końcowymi.

print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]

Używając plasterków, możemy otrzymać ciąg równoważny surowemu ciągowi z dołączonym r.

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

Zwróć uwagę na odwrotny ukośnik na końcu.

Ponieważ odwrotny ukośnik wymyka się znakowi cytującemu bezpośrednio po nim, błąd wystąpi jeśli na końcu łańcucha znajdzie się nieparzysta liczba odwrotnych ukośników. Parzysta liczba odwrotnych ukośników jest OK.

# print(r'\')
# SyntaxError: EOL while scanning string literal

print(r'\\')
# \\

# print(r'\\\')
# SyntaxError: EOL while scanning string literal
Copied title and URL