Ignorování (zakázání) escape sekvencí v jazyce Python se surovými řetězci

Podnikání

'...', "..."Pokud v jazyce Python předřadíte těmto řetězcovým literálům některý z následujících znaků, hodnota se stane řetězcem bez expanze escape sekvence.

  • r
  • R

Užitečné při práci s řetězci, které používají mnoho zpětných lomítek, jako jsou cesty systému Windows a vzory regulárních výrazů.
Zde jsou uvedeny následující informace.

  • escape sekvence
  • Ignorování (zakázání) escape sekvencí v nezpracovaných řetězcích
  • Převod normálního řetězce na nezpracovaný řetězec:repr()
  • Všimněte si zpětného lomítka na konci.

escape sekvence

V jazyce Python se znaky, které nelze reprezentovat v normálním řetězci (například tabulátory a nové řádky), popisují pomocí escape sekvencí se zpětnými lomítky, podobně jako v jazyce C. Příklad escape sekvence je uveden níže.

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

Ignorování (zakázání) escape sekvencí v nezpracovaných řetězcích

'...', "..."Pokud před takový řetězcový literál vložíte jednu z následujících předpon, hodnota se stane řetězcem bez rozbalení escape sekvence. Takový řetězec se nazývá surový řetězec.

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

Neexistuje žádný speciální typ nazvaný raw string type, je to prostě typ řetězce a rovná se normálnímu řetězci se zpětným lomítkem, který je reprezentován takto
\\

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

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

V normálním řetězci je escape sekvence považována za jeden znak, ale v nezpracovaném řetězci jsou zpětná lomítka také považována za znaky. Délka řetězce a jednotlivých znaků je následující.

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

Cesta k systému Windows

Použití surového řetězce je užitečné, pokud chcete reprezentovat cestu systému Windows jako řetězec.

Cesty v systému Windows jsou odděleny zpětnými lomítky, takže pokud použijete normální řetězec, musíte cestu escapovat následujícím způsobem, ale pokud použijete nezpracovaný řetězec, můžete jej zapsat tak, jak je. Hodnoty jsou ekvivalentní.
\\

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

Všimněte si, že řetězec končící lichým počtem zpětných lomítek způsobí chybu, jak je popsáno níže. V takovém případě je nutné zapsat řetězec jako normální řetězec nebo jej spojit tak, že jako normální řetězec zapíšete pouze konec řetězce.

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

Převod normálních řetězců na nezpracované řetězce pomocí funkce repr()

Pokud chcete převést normální řetězec na nezpracovaný řetězec s ignorováním (vypnutím) escape sekvencí, můžete použít vestavěnou funkci repr().

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

Funkce repr() vrací řetězec reprezentující objekt tak, že má stejnou hodnotu, jaká byla předána funkci eval(), s počátečními a koncovými znaky.

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

Pomocí řezů můžeme získat řetězec ekvivalentní nezpracovanému řetězci s připojeným 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

Všimněte si zpětného lomítka na konci.

Protože zpětné lomítko uniká znaku uvozovek, který následuje bezprostředně za ním, dojde k chybě, pokud je na konci řetězce lichý počet zpětných lomítek. Sudý počet zpětných lomítek je v pořádku.

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

print(r'\\')
# \\

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