Technicznie, dowolna nieparzysta liczba ukośników odwrotnych, zgodnie z opisem w dokumentacji .
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
File "<stdin>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
Wygląda na to, że parser może po prostu traktować odwrotne ukośniki w surowych ciągach jako zwykłe znaki (czy nie o to chodzi w surowych ciągach?), Ale prawdopodobnie brakuje mi czegoś oczywistego.
Odpowiedzi:
Powód jest wyjaśniony w części tej sekcji, którą zaznaczyłem pogrubioną czcionką:
Tak więc nieprzetworzone łańcuchy nie są w 100% surowe, nadal istnieje pewne podstawowe przetwarzanie odwrotnego ukośnika.
źródło
r"foo\bar\baz" "\\"
(zawijaj pareny, jeśli niejednoznaczne) utworzy pojedynczy literał w czasie kompilacji, którego pierwsza część jest surowa, a tylko ostatni mały bit nie jest surowy, aby umożliwić końcowy ukośnik odwrotny.Całe błędne przekonanie na temat nieprzetworzonych ciągów znaków w Pythonie jest takie, że większość ludzi uważa, że ukośnik odwrotny (w ciągu nieprzetworzonym) jest zwykłym znakiem, jak wszystkie inne. Nie jest. Kluczem do zrozumienia jest sekwencja samouczków w języku Python:
Tak więc każdy znak następujący po odwrotnym ukośniku jest częścią nieprzetworzonego ciągu. Gdy parser wpisze nieprzetworzony ciąg (inny niż Unicode) i napotka ukośnik odwrotny, wie, że są 2 znaki (ukośnik odwrotny i znak po nim).
Tą drogą:
i:
Ostatni przypadek pokazuje, że zgodnie z dokumentacją parser nie może teraz znaleźć cudzysłowu zamykającego, ponieważ ostatni cytat, który widzisz powyżej, jest częścią ciągu, tj. Ukośnik odwrotny nie może być tutaj ostatni, ponieważ pochłonie znak zamykający łańcuch.
źródło
Tak to jest! Widzę to jako jedną z tych małych wad w Pythonie!
Myślę, że nie ma ku temu dobrego powodu, ale na pewno nie jest to analizowanie; bardzo łatwo jest przeanalizować nieprzetworzone łańcuchy z \ jako ostatnim znakiem.
Problem polega na tym, że jeśli pozwolisz, aby \ był ostatnim znakiem w nieprzetworzonym łańcuchu, nie będziesz w stanie umieścić "wewnątrz nieprzetworzonego łańcucha. Wygląda na to, że Python pozwolił" zamiast dopuszczać \ jako ostatni znak.
Nie powinno to jednak powodować żadnych problemów.
Jeśli martwisz się, że nie będziesz w stanie łatwo pisać ścieżek folderów systemu Windows, takich jak
c:\mypath\
wtedy, nie martw się, ponieważ możesz je przedstawić jakor"C:\mypath"
, a jeśli chcesz dołączyć nazwę podkatalogu, nie rób tego z konkatenacją ciągów, ponieważ i tak nie jest to właściwy sposób! posługiwać sięos.path.join
źródło
Aby zakończyć nieprzetworzony ciąg ukośnikiem, sugeruję skorzystać z tej sztuczki:
źródło
Inną sztuczką jest użycie chr (92), który daje „\”.
Niedawno musiałem wyczyścić ciąg odwrotnych ukośników i następujące rozwiązanie załatwiło sprawę:
Zdaję sobie sprawę, że to nie dba o „dlaczego”, ale wątek przyciąga wiele osób szukających rozwiązania pilnego problemu.
źródło
"\\"
(nie surowy sznurek z backslash)Ponieważ \ "jest dozwolone wewnątrz nieprzetworzonego ciągu. W takim przypadku nie można go użyć do zidentyfikowania końca literału ciągu.
Dlaczego nie przestać analizować literału ciągu, gdy napotkasz pierwszy „?
W takim przypadku \ "nie byłoby dozwolone wewnątrz literału ciągu. Ale tak jest.
źródło
\"
dowolnym miejscu w ciągu znaków w podwójnych cudzysłowach, LUB \ na końcu nieprzetworzonego ciągu w cudzysłowie. Statystyki użytkowania muszą faworyzować sekwencję dwóch znaków w dowolnym miejscu w porównaniu z sekwencją jednoznakową na końcu.Przyczyną
r'\'
błędu składniowego jest to, że chociaż wyrażenie łańcuchowe jest surowe, użyte cudzysłowy (pojedyncze lub podwójne) zawsze muszą zostać zmienione, ponieważ w przeciwnym razie oznaczałyby koniec cudzysłowu. Więc jeśli chcesz wyrazić pojedynczy cudzysłów w pojedynczym cudzysłowie, nie ma innego sposobu niż użycie\'
. To samo dotyczy podwójnych cudzysłowów.Ale możesz użyć:
źródło
Inny użytkownik, który od tego czasu usunął swoją odpowiedź (nie jest pewien, czy chciałby otrzymać kredyt), zasugerował, że projektanci języka Python mogą być w stanie uprościć projekt parsera, stosując te same reguły analizowania i rozszerzając znaki ucieczki do postaci surowej, jak po namyśle (jeśli literał został oznaczony jako surowy).
Pomyślałem, że to ciekawy pomysł i włączam go jako wiki społeczności dla potomnych.
źródło
źródło
Wychodząc z C, jest dla mnie całkiem jasne, że pojedynczy znak \ działa jak znak ucieczki, umożliwiając umieszczanie znaków specjalnych, takich jak nowe linie, tabulatory i cudzysłowy, w łańcuchach.
To faktycznie zabrania \ as ostatniego znaku, ponieważ ucieknie przed "i sprawi, że parser się zakrztusi. Ale jak wskazano wcześniej \ jest legalny.
źródło
kilka porad :
1) jeśli musisz manipulować odwrotnym ukośnikiem dla ścieżki, to standardowy moduł Pythona os.path jest twoim przyjacielem. na przykład :
2) jeśli chcesz zbudować łańcuchy z odwrotnym ukośnikiem, ALE bez odwrotnego ukośnika na końcu swojego ciągu, to surowy łańcuch jest twoim przyjacielem (użyj przedrostka „r” przed literałem). na przykład :
3) jeśli chcesz poprzedzić ciąg w zmiennej X odwrotnym ukośnikiem, możesz to zrobić:
4) jeśli chcesz utworzyć ciąg z ukośnikiem odwrotnym na końcu, połącz końcówki 2 i 3:
zawiera teraz lilypond_statement
"\DisplayLilyMusic \upper"
niech żyje Python! :)
n3on
źródło
os.path.normpath
usunie tylny ukośnik odwrotny ... Więc jak mam połączyć nazwę pliku ze ścieżką ...Napotkałem ten problem i znalazłem częściowe rozwiązanie, które jest dobre w niektórych przypadkach. Pomimo że Python nie jest w stanie zakończyć łańcucha pojedynczym ukośnikiem odwrotnym, można go serializować i zapisać w pliku tekstowym z pojedynczym ukośnikiem odwrotnym na końcu. Dlatego jeśli potrzebujesz zapisać tekst z pojedynczym ukośnikiem odwrotnym na swoim komputerze, jest możliwe:
BTW, nie działa z json, jeśli zrzucisz go za pomocą biblioteki json w Pythonie.
Wreszcie pracuję ze Spyderem i zauważyłem, że jeśli otworzę zmienną w edytorze tekstu pająka, klikając dwukrotnie jej nazwę w eksploratorze zmiennych, jest ona prezentowana z pojedynczym ukośnikiem odwrotnym i można ją w ten sposób skopiować do schowka (nie jest bardzo pomocny dla większości potrzeb, ale może dla niektórych ...).
źródło