Het negeren (uitschakelen) van escape-sequenties in Python met ruwe strings

Bedrijf

'...', "..."In Python, als je deze string literals voorvoegt met één van de volgende karakters, zal de waarde een string worden zonder de escape sequentie uit te breiden.

  • r
  • R

Nuttig bij strings die veel backslashes gebruiken, zoals Windows paden en reguliere expressiepatronen.
De volgende informatie wordt hier verstrekt.

  • ontsnappingssequentie
  • Negeer (deactiveer) escape-sequenties in onbewerkte tekenreeksen
  • Normale string omzetten in onbewerkte string:repr()
  • Let op de backslash aan het eind.

ontsnappingssequentie

In Python worden tekens die niet in een normale tekenreeks kunnen worden weergegeven (zoals tabs en nieuwe regels) beschreven met escape-reeksen met backslashes, vergelijkbaar met de C-taal. Een voorbeeld van een escape-sequentie staat hieronder.

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

Negeer (deactiveer) escape-sequenties in onbewerkte tekenreeksen

'...', "..."Als je zo'n string literal vooraf laat gaan door een van de volgende, wordt de waarde een string zonder de escape-sequentie uit te breiden. Zo'n string wordt een raw string genoemd.

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

Er is geen speciaal type dat raw string type heet, het is gewoon een string type en is gelijk aan een normale string met een backslash, voorgesteld als volgt
\\

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

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

In een normale string wordt een escape-sequentie beschouwd als één karakter, maar in een onbewerkte string worden backslashes ook geteld als karakters. De lengte van de string en elk karakter is als volgt.

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 Pad

Het gebruik van de ruwe string is handig wanneer u een Windows pad als een string wilt weergeven.

Windows paden worden gescheiden door backslashes, dus als je een normale string gebruikt, moet je het pad als volgt escapen, maar als je een raw string gebruikt, kun je het schrijven zoals het is. De waarden zijn gelijkwaardig.
\\

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

Merk op dat een string die eindigt met een oneven aantal backslashes een foutmelding oplevert, zoals hieronder beschreven. In dat geval moet de string als een normale string worden geschreven, of aaneengeschakeld worden door alleen het einde van de string als een normale string te schrijven.

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

Converteer normale strings naar ruwe strings met repr()

Als je een normale string wilt omzetten in een ruwe string waarbij escape-sequences worden genegeerd (uitgeschakeld), kun je de ingebouwde functie repr() gebruiken.

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

Wat repr() teruggeeft is een string die een object vertegenwoordigt, zodanig dat het dezelfde waarde heeft als toen het werd doorgegeven aan eval(), met voorloop- en naloopkarakters.

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

Met behulp van slices kunnen we een string krijgen die gelijkwaardig is aan de onbewerkte string met r erbij.

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

Let op de backslash aan het eind.

Aangezien een backslash het teken van de aanhalingsteken onmiddellijk erna escaped, zal er een fout optreden als er een oneven aantal backslashes aan het eind van de string staan. Een even aantal backslashes is OK.

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

print(r'\\')
# \\

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