2010-02-01 18 views
17

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]

+0

Wiedząc zilch o Pythona: string = string.replace ('&', '&') ... może metoda replace wyjdzie ci z tego wzmacniacza ... heh – iandisme

+6

Jeśli nadal używasz SO, proszę oznaczyć rozwiązanie! – erikbwork

+0

@Veedrac: Jak to 4-letnie pytanie zostało oznaczone jako duplikat pytania zadanego 6 dni temu? – User

Odpowiedz

17

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__() 
'\\' 
3

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

55

Wynik '\\&' jest tylko - faktycznie ciąg jest \&:

>>> str = '&' 
>>> new_str = str.replace('&', '\&') 
>>> new_str 
'\\&' 
>>> print new_str 
\& 

Wypróbuj go w powłoce.

+7

Dlaczego nie jest to oznaczone jako rozwiązanie? – erikbwork

5
>>> '\\&' == '\&' 
True 
>>> len('\\&') 
2 
>>> print('\\&') 
\& 

Lub innymi słowy: '\\&' zawiera tylko jeden ukośnik odwrotny. Po prostu uciekł w powłoce Pythona dla przejrzystości.

12

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.

+0

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!). –

+0

@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. –

1

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) 
\& 
Powiązane problemy