Backslashes citeren in letterlijke tekenreeksen van Python

Ik heb een string die zowel dubbele aanhalingstekens als backslashes bevat die ik wil instellen op een variabele in Python. Wanneer ik het echter probeer in te stellen, worden de aanhalingstekens of schuine strepen verwijderd of ontsnapt. Hier is een voorbeeld:

>>> foo = 'baz "\"'
>>> foo
'baz ""'

Dus in plaats van baz "\"zoals ik wil, krijg ik baz "". Als ik dan probeer te ontsnappen aan de backslash, helpt het ook niet:

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'

Wat nu overeenkomt met wat ik erin heb gestopt, maar niet was wat ik oorspronkelijk wilde. Hoe los je dit probleem op?


Antwoord 1, autoriteit 100%

Je wordt misleid door output — de tweede benadering die je kiest doet eigenlijk wat je wilt, je gelooft het alleen niet. 🙂

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
>>> print(foo)
baz "\"

Overigens is er nog een andere tekenreeksvorm die misschien wat duidelijker is:

>>> print(r'baz "\"')
baz "\"

Antwoord 2, autoriteit 42%

Gebruik een onbewerkte tekenreeks:

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'

Merk op dat hoewel het er verkeerd uitziet, het in werkelijkheid juist is. Er is slechts één backslash in de string foo.

Dit gebeurt, want wanneer u gewoon footypt op de prompt, geeft Python het resultaat van __repr__()op de tekenreeks weer. Dit leidt tot het volgende (merk slechts één backslash en geen aanhalingstekens rond de printed string):

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
>>> print(foo)
baz "\"

En laten we doorgaan omdat er meer backslash-trucs zijn. Als u een backslash aan het einde van de tekenreeks wilt hebben en de bovenstaande methode gebruikt, zult u een probleem tegenkomen:

>>> foo = r'baz \'
  File "<stdin>", line 1
    foo = r'baz \'
                 ^  
SyntaxError: EOL while scanning single-quoted string

Ruwe snaren werken niet goed als je dat doet. U moet een gewone reeks gebruiken en aan uw backslashes ontsnappen:

>>> foo = 'baz \\'
>>> print(foo)
baz \

Als u echter werkt met Windows-bestandsnamen, bent u voor wat pijn. Wat u wilt doen, is voorwaartse schuine strepen en de os.path.normpath()functie gebruiken:

myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)

Hiermee bespaart u veel ontsnapping en haarscheuren. deze pagina was handig bij dit een tijdje geleden.


Antwoord 3, Autoriteit 5%

Wat Harley zei, behalve het laatste punt – het is niet echt nodig om de ‘/’ s in ‘\’ s voordat u open belt. Windows is heel blij om paden te accepteren met sjormes.

infile = open('c:/folder/subfolder/file.txt')

De enige keer dat u waarschijnlijk nodig hebt, is dat de string-normpathed is als u via de Shell naar een ander programma loopt (met behulp van os.systemof subprocessmodule).


Antwoord 4

Als u hier bent voor een FilePath, gebruik dan "\\"

import os
path = r"c:\file"+"\\"+"path"
os.path.normpath(path)

die wordt uitgevoerd c:\file\path


Antwoord 5

Een andere manier om een ​​string met een backslash te beëindigen is om de reeks te beëindigen met een backslash gevolgd door een spatie en vervolgens de .strip()-functie op de tekenreeks te bellen.

Ik probeerde twee tekenreeksvariabelen aan te voegen en laat ze gescheiden door een backslash, dus ik heb het volgende gebruikt:

newString = string1 + "\ ".strip() + string2

Other episodes