2015-11-25 19 views
5

Proszę odnieść się do tego wyrażenia regularnego HOWTO dla python3Dlaczego wyrażanie wyrażenia regularnego zawierającego "" działa bez ciągłego łańcucha.

https://docs.python.org/3/howto/regex.html#performing-matches

>>> p = re.compile('\d+') 
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') 
['12', '11', '10'] 

Czytałem, że dla wyrażenia regularnego zawierającego '\', surowe ciągi powinny być używane jak r'\d+' ale w tym fragmencie kodu re.compile('\d+') stosuje się bez przy użyciu specyfikatora r. I działa dobrze. Dlaczego to działa? Dlaczego to wyrażenie regularne nie wymaga poprzedzającego go "r"?

Odpowiedz

8

Zdarza się, ponieważ '\d' nie odpowiada specjalnemu znakowi, takim jak '\n' lub '\t' do. Czasami nieprzetworzony ciąg znaków jest taki sam, jak zwykła wersja łańcucha. Ogólnie rzecz biorąc, surowe ciągi zapewnią, że nie dostaniesz żadnych niespodzianek w wyrażaniu.

+3

Po prostu '\ d' nie jest prawidłową sekwencją escape, a gdy Python ją znajdzie, traktuje symbol' '\' 'jako literał' '\' '. [* W odróżnieniu od standardowego C wszystkie nierozpoznane sekwencje specjalne pozostają w ciągach bez zmian, tj. Lewy ukośnik pozostaje w łańcuchu. (Takie zachowanie jest przydatne podczas debugowania: jeśli sekwencja escape jest źle wpisana, wynik wyjściowy jest łatwiejszy do rozpoznania jako zepsuty). Ważne jest również, aby pamiętać, że sekwencje specjalne rozpoznawane tylko w literałach łańcuchowych należą do kategorii nierozpoznanych ucieczek dla bajtów. literały. *] (https://docs.python.org/3.1/reference/lexical_analysis.html) –

Powiązane problemy