Znak r przed wyrażeniem regularnym mówi w wywołaniu wyszukiwania() określa, że wyrażenie regularne jest nieprzetworzonym łańcuchem znaków. Dzięki temu ukośniki odwrotne mogą być używane w wyrażeniu regularnym jako zwykłe znaki, a nie w sekwencji unikowej znaków. Pozwól mi wyjaśnić ...
Zanim metoda wyszukiwania w module re przetwarza łańcuchy, które są do niej przekazywane, interpreter Pythona wykonuje wstępne przejście przez ciąg znaków. Jeśli w ciągu występują ciągi odwrotne, interpreter w języku Python musi zdecydować, czy każdy z nich jest częścią sekwencji wyjściowej w języku Python (np. \ N lub \ t), czy też nie.
Uwaga: w tym momencie Python nie dba o to, czy "\" jest metaznakiem wyrażenia regularnego.
Po znaku "\" po rozpoznanym znaku interpunkcyjnym języka Python (t, n itp.), Odwrotny ukośnik i znak escape są zamieniane na rzeczywisty znak Unicode lub 8-bitowy. Na przykład "\ t" zostanie zastąpione przez znak ASCII dla tabulatora. W przeciwnym razie jest przekazywana i interpretowana jako znak "\".
Należy rozważyć następujące kwestie.
>>> s = '\t'
>>> print ("[" + s + "]")
>>> [ ] // an actual tab character after preprocessing
>>> s = '\d'
>>> print ("[" + s + "]")
>>> [\d] // '\d' after preprocessing
Czasami chcemy umieścić w ciąg ciąg znaków, który zawiera „\” bez niego są interpretowane przez Python jako sekwencji ucieczki. W tym celu unikamy "\" z "\". Teraz, gdy Python widzi "\", zastępuje dwa tylne ukośniki pojedynczym znakiem "\".
>>> s = '\\t'
>>> print ("[" + s + "]")
>>> [\t] // '\t' after preprocessing
Po przejściu przez interpreter języka Python obu łańcuchów, są one przekazywane do metody wyszukiwania modułu re. Metoda wyszukiwania analizuje łańcuch wyrażenia regularnego, aby zidentyfikować meta-znaki wyrażenia regularnego.
Teraz "\" jest również specjalnym meta-znakiem wyrażenia regularnego i jest interpretowane jako jedno, O ile nie jest ono zmienione w czasie wykonywania metody re search().
Rozważ następujące połączenie.
>>> match = re.search('a\\t','a\\t') //Match is None
Tutaj mecz jest Brak. Czemu? Przyjrzyjmy się ciągom znaków po tym, jak interpreter Pythona przejdzie.
String 1: 'a\t'
String 2: 'a\t'
Dlaczego więc mecz jest równy None?Gdy search() interpretuje String 1, ponieważ jest to wyrażenie regularne, ukośnik odwrotny jest interpretowany jako meta-znak, a nie jako zwykły znak. Odwrotny ukośnik w łańcuchu 2 nie jest jednak wyrażeniem regularnym i został już przetworzony przez interpreter języka Python, więc jest interpretowany jako zwykły znak.
Metoda search() szuka 'escape-t' w ciągu znaków "a \ t", które nie są zgodne.
Aby to naprawić, możemy powiedzieć, że metoda search() nie interpretuje "\" jako meta-znaku. Możemy to zrobić, uciekając przed tym.
Rozważ następujące połączenie.
>>> match = re.search('a\\\\t','a\\t') // Match contains 'a\t'
Ponownie, pozwala spojrzeć na ciągi po tym, jak interpreter Pythona wykonał przekaz.
String 1: 'a\\t'
String 2: 'a\t'
Teraz, gdy metoda search() przetwarza wyrażenie regularne, to widzi, że drugi backslash jest uciekł przez pierwszy i nie powinien być traktowany jako meta-znaków. Dlatego interpretuje ciąg jako "a \ t", który pasuje do ciągu znaków 2.
Alternatywny sposób wyszukiwania() jako "znak" oznacza umieszczenie r przed wyrażeniem regularnym. Dzięki temu interpreter języka Python NIE przetwarza ciągu.
Rozważ to.
>>> match = re.search(r'a\\t','a\\t') // match contains 'a\t'
Tutaj interpreter języka Python nie modyfikuje pierwszego ciągu, ale przetwarza drugi ciąg znaków. Struny przekazywane do search() są:
String 1: 'a\\t'
String 2: 'a\t'
Podobnie jak w poprzednim przykładzie, wyszukiwarka interpretuje „\” jako pojedynczy znak „\” a nie meta-znaków, co odpowiada sznurkiem 2.
http://stackoverflow.com/questions/24085680/why-do-backslashes-appear-twice – fghj
Możliwy duplikat [Nie można uciec przed ukośnikiem z wyrażeniem regularnym?] (Https://stackoverflow.com/questions/4025482/ cant-escape-the-backslash-with-regex) – tripleee