Zanurkuj w Pythonie/Analiza przypadku: Przetwarzanie numerów telefonów: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
→Analiza przypadku: Przetwarzanie numerów telefonów: kolejna porcja translacji |
→Analiza przypadku: Przetwarzanie numerów telefonów: koniec tłumaczenia |
||
Linia 99:
>>>
# Wzorzec w tym przykładzie jest taki sam jak w poprzednim, z wyjątkiem, że teraz na początku łańcucha dopasowujemy \D* przed pierwszą zapamiętywaną grupą (numerem kierunkowym). Zauważ że tych znaków nie zapamiętujemy tych znaków (nie są one w nawiasie). Jeśli je napotkamy, to ignorujemy je i przechodzimy do numeru kierunkowego.
# Teraz udało się przetworzyć numer telefonu z nawiasem otwierającym na początku. (Zamykający był już wcześniej obsługiwany; był traktowany jako nienumeryczny znak pasujący do teraz drugiego \D*.)
# Tak na wszelki wypadek sprawdzamy czy nie popsuliśmy czegoś. Jako, że początkowy znak jest całkowicie opcjonalny, następuje dopasowanie w dokładnie taki sam sposób jak w poprzednim przykładzie.
# W tym miejscu wyrażenia regularne sprawiają, że chce sie człowiekowi rozbić bardzo dużym młotem monitor. Dlaczego to nie pasuje? Wszystko za sprawą 1 przed numerem kierunkowym (numer kierunkowy USA), a przecież przyjęliśmy, że na początku mogą być tylko nienumeryczne znaki. Ech...
Cofnijmy się na chwilę. Jak narazie wszystkie wyrażenia dopasowywaliśmy od początku łańcucha. Ale teraz widać wyraźnie, że na początku naszego łańcucha mamy nieokreśloną liczbę znaków których kompletnie nie potrzebujemy. Po co mamy więc dopasowywać początek łańcucha? Jeśli tego nie zrobimy, to przecież pominie on tyle znaków ile mu się uda, a przecież o to nam chodzi. Takie podejście prezentuje następny przykład.
'''Przykład 7.15. Numerze telefonu, znajdę cię gdziekolwiek jesteś!'''
Linia 116:
('800', '555', '1212', '1234')
# Zauważ, że brakuje ^ w tym wyrażeniu regularnym, Teraz już nie dopasowujemy początku łańcucha, bo przecież nikt nie powiedział, że wyrażenie musi pasować do całego łańcucha a nie do fragmentu. Mechanizm wyrażeń regularnych sam zadba o namierzenie miejsca do którego ono pasuje (o ile w ogóle).
# Teraz nareszcie pasuje numer ze znakami na początku (w tym cyframi) i dowolnymi, jakimikolwiek separatorami w środku.
# Na wszelki wypadek sprawdzamy i to. Działa!
#
Widzisz jak szybko wyrażenia regularne wymykają się spod kontroli? Rzuć okiem na jedną z poprzednich iteracji. Widzisz różnice pomiędzy nią i następną?
Póki jeszcze rozumiemy to co napisaliśmy, rozpiszmy to jako rozwlekłe wyrażenie regularne żeby nie zapomnieć co jest co i dlaczego.
'''Przykład 7.16. Przetwarzanie numerów telefonu (wersja finalna)'''
<nowiki>>>> phonePattern = re.compile(r'''
#
(\d{3}) #
\D* #
(\d{3}) #
\D* #
(\d{4}) #
\D* #
(\d*) #
$ #
''', re.VERBOSE)
>>> phonePattern.search('work 1-(800) 555.1212 #1234').groups() #(1)
Linia 143:
('800', '555', '1212', '')</nowiki>
# Pomijając fakt, że jest ono podzielone na wiele linii, to wyrażenie jest dokładnie takie samo jak po ostatnim kroku, więc nie jest niespodzianką, że dalej działa jak powinno
# Jeszcze jedna próba. Tak, działa! Skończone!
<noinclude>
|