Próbując dowiedzieć się więcej o wyrażeniach regularnych, w samouczku zasugerowano, że możesz użyć znaku, \b
aby dopasować granicę słowa. Jednak następujący fragment kodu w interpreterze języka Python nie działa zgodnie z oczekiwaniami:
>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)
Powinien być obiektem dopasowania, jeśli cokolwiek zostało dopasowane, ale tak jest None
.
Czy \b
wyrażenie nie jest obsługiwane w Pythonie, czy też używam go źle?
re.search(r"\btwo\b", x)
r"\btwo\b"
?\b
.r'\b'
aby znak został pominięty. (albo podwójna ucieczka\\b
, co jest dziwne)Odpowiedzi:
Dlaczego nie spróbujesz
Wynik:
Zapomniałem również wspomnieć, że powinieneś używać nieprzetworzonych ciągów w kodzie
źródło
%
podstawieniem łańcucha jest zła tangens, nieistotna dla tego konkretnego pytania.To zadziała:
re.search(r"\btwo\b", x)
Gdy piszesz
"\b"
w Pythonie, jest to pojedynczy znak:"\x08"
. Albo uniknij odwrotnego ukośnika w ten sposób:lub napisz nieprzetworzony ciąg w ten sposób:
źródło
Aby wyraźnie wyjaśnić, dlaczego
re.search("\btwo\b", x)
nie działa, dzieje się tak, ponieważ\b
w ciągu Pythona jest skrótem dla znaku cofania.Tak więc wzorzec
"\btwo\b"
szuka znaku cofnięcia, po którymtwo
następuje kolejny znak cofania, którego nie ma w ciągu szukanym w (x = 'one two three'
).Aby umożliwić
re.search
(lubcompile
) zinterpretowanie sekwencji\b
jako granicy wyrazu, należy uciec przed ukośnikami odwrotnymi ("\\btwo\\b"
) lub użyć nieprzetworzonego ciągu znaków do utworzenia wzorca (r"\btwo\b"
).źródło
Dokumentacja Pythona
https://docs.python.org/2/library/re.html#regular-expression-syntax
źródło