Muszę uciec od znaku &
(znak ampersand) w ciągu znaków. Problem występuje zawsze, gdy I string = string.replace ('&', '\&')
wynikiem jest '\\&'
. Dodatkowy ukośnik został dodany, aby uniknąć oryginalnego ukośnika odwrotnego. Jak mogę usunąć ten dodatkowy ukośnik odwrotny?Dodawanie ukośników odwrotnych bez ucieczki [Python]
Odpowiedz
Dodatkowy ukośnik odwrotny w rzeczywistości nie jest dodawany; jest on dodawany po prostu przez funkcję repr()
, aby wskazać, że jest to dosłowny ukośnik odwrotny. Interpreter Pythona używa funkcji repr()
(który wywołuje __repr__()
na obiekcie), gdy wynik wyrażenia musi być wydrukowane:
>>> '\\'
'\\'
>>> print '\\'
\
>>> print '\\'.__repr__()
'\\'
Nie ma dodatkowy ukośnik, to tylko sformatowany w ten sposób w interaktywnym środowisku. Wypróbuj:
print string
Następnie widać, że nie ma żadnego dodatkowego odwrotnego ukośnika. Wyświetlane
Wynik '\\&'
jest tylko - faktycznie ciąg jest \&
:
>>> str = '&'
>>> new_str = str.replace('&', '\&')
>>> new_str
'\\&'
>>> print new_str
\&
Wypróbuj go w powłoce.
Dlaczego nie jest to oznaczone jako rozwiązanie? – erikbwork
>>> '\\&' == '\&'
True
>>> len('\\&')
2
>>> print('\\&')
\&
Lub innymi słowy: '\\&'
zawiera tylko jeden ukośnik odwrotny. Po prostu uciekł w powłoce Pythona dla przejrzystości.
Python traktuje \
literalnie w sposób specjalny.
Jest więc można wpisać '\n'
oznaczać przełamane lub '\t'
oznaczać Tab
Rejestracja '\&'
nie oznacza nic szczególnego do Python zamiast powodując błąd, analizator leksykalny Python domyślnie dodaje dodatkowy \
dla ty.
Naprawdę lepiej jest użyć \\&
lub r'\&'
zamiast '\&'
r
tutaj oznacza surowy ciąg i oznacza, że \
nie jest traktowany specjalnie, chyba że jest tuż przed znak cudzysłowu na początku strunowy.
W konsoli interaktywnej Python używa repr
do wyświetlenia wyniku, dlatego właśnie widzisz podwójne "\". Jeśli print
ciąg lub użyj len(string)
widać, że jest to naprawdę tylko 2 znaki
Niektóre przykłady
>>> 'Here\'s a backslash: \\'
"Here's a backslash: \\"
>>> print 'Here\'s a backslash: \\'
Here's a backslash: \
>>> 'Here\'s a backslash: \\. Here\'s a double quote: ".'
'Here\'s a backslash: \\. Here\'s a double quote: ".'
>>> print 'Here\'s a backslash: \\. Here\'s a double quote: ".'
Here's a backslash: \. Here's a double quote ".
aby wyjaśnić punkt Peter sprawia, że w swoim komentarzu zobaczyć this link
przeciwieństwie Standardowe C, wszystkie nierozpoznane sekwencje specjalne pozostają w ciągach niezmienione, tj. Lewy ukośnik pozostaje w łańcuchu.(To zachowanie jest przydatna diagnostycznych: jeśli ucieczka sekwencja jest źle wpisany otrzymaną wyjście jest łatwiej uznawane za przerywaną). Jest również ważne, aby zauważyć, że sekwencje oznaczone jako „(tylko Unicode)” w tabeli powyżej należą do kategorii nierozpoznanych escapes dla znaków nie-Unicode literałów.
Część tego nie jest poprawna. Python robi * nie * "niejawnie dodaje dodatkowe" \ "dla ciebie". Ma jednak podwójny lewy uk³ad odwzorowania, gdy wyœwietlany jest wynik repr() napisu, tak jak w monicie, tylko dla celów prezentacji. len ("\ &") wynosi tylko 2, co dowodzi, że nie ma żadnego niejawnego zmieszania danych (dziękuję niebiosom!). –
@PeterHansen Myślę, że OP wskazywał, że czarne kresy powinny normalnie być unikane w nie-surowych łańcuchach, więc zwykle jest napisane podwójnie. –
drukując listę może również powodować ten problem (Im nowego w Pythonie, więc mylić mnie trochę zbyt):
>>>myList = ['\\']
>>>print myList
['\\']
>>>print ''.join(myList)
\
podobnie:
>>>myList = ['\&']
>>>print myList
['\\&']
>>>print ''.join(myList)
\&
- 1. Python re "fikcyjny błąd ucieczki"
- 2. Jak wydrukować łańcuch zakończony znakiem Null za pomocą znaków nowej linii bez pokazywania odwrotnych ukośników w gdb?
- 3. Dekodowanie adresu ucieczki bez użycia HttpUtility.UrlDecode
- 4. Ember - Zrozumienie odwrotnych relacji
- 5. Usuwanie ukośników z łańcucha znaków w języku Python
- 6. Ujednolicenie ukośników i ukośników w systemie UNIX/Windows
- 7. Wcięcie ukośników komentarzy linii
- 8. Python sys.path - dodawanie PYTHONPATH
- 9. znaki ucieczki
- 10. numpy oszustwo matrix - suma macierzy odwrotnych razy
- 11. Ucieczki cytaty w jinja2
- 12. Dodawanie funkcjonalności Readline bez rekompilacji Pythona
- 13. Rozwiązywanie odwrotnych problemów z PyMC
- 14. Używanie operatorów odwrotnych w Pythonie
- 15. Wyszukiwanie zależności odwrotnych w hakowaniu
- 16. sekwencja ucieczki Python \ N {nazwa} nie działa zgodnie z definicją
- 17. Szyny Regex ostrzeżenie: klasa znaków ma "-" bez ucieczki
- 18. Groovy: Jak mogę włączyć backslashes wewnątrz łańcucha bez ucieczki?
- 19. Używanie ukośników wokół nazw pól
- 20. Python: dodawanie nazw w lxml
- 21. Amazon S3 Presigned URLs uciekają z ukośników w kluczu
- 22. Dodawanie murarski kątowym bez JQuery
- 23. ucieczki $ znak dolara w CMake
- 24. json_encode() ucieczki ukośnik
- 25. jinja2: zmienne ucieczki html
- 26. ucieczki ciąg w Ruby
- 27. rura ucieczki ("|") w regex
- 28. Ucieczki wsporniki w Clojure
- 29. bash - kody ucieczki kolorów
- 30. Implementowanie trygonometrycznych funkcji odwrotnych w C#
Wiedząc zilch o Pythona: string = string.replace ('&', '&') ... może metoda replace wyjdzie ci z tego wzmacniacza ... heh – iandisme
Jeśli nadal używasz SO, proszę oznaczyć rozwiązanie! – erikbwork
@Veedrac: Jak to 4-letnie pytanie zostało oznaczone jako duplikat pytania zadanego 6 dni temu? – User