Zanurkuj w Pythonie/Analiza przypadku: Przetwarzanie numerów telefonów: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
mNie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 17:
* work 1-(800) 555.1212 #1234
Całkiem duże zróżnicowanie! W każdym z przypadków musiałem wiedzieć jaki jest numer kierunkowy (800), pierwsza część numeru (555), druga (1212), a dla tych z numerem wewnętrznym także i
Spróbujmy rozwiązać ten problem. Poniższy przykład pokazuje pierwszy krok.
Linia 29:
>>>
# Zawsze odczytuj wyrażenie regularne od lewej do prawej. To dopasowuje początek łańcucha znaków, potem (\d{3}). Co to takiego (\d{3})? {3} oznacza "dopasuj dokładnie 3 wystąpienia" (jest to wariacja składni {n, m}). \d oznacza "jakakolwiek cyfra" (od 0 do 9).
# Aby otrzymać grupy które zapamięta moduł przetwarzania wyrażeń regularnych, należy skorzystać z metody groups() obiektu zwracanego przez funkcję
# To jednak nie jest rozwiązaniem naszego problemu, bo nie dopasowuje numeru telefonu z numerem wewnętrznym. Musimy więc je rozszerzyć.
Linia 44:
# To wyrażenie regularne jest praktycznie identyczne z wcześniejszym. Tak jak wcześniej, dopasowujemy początek łańcucha, potem zapamiętywaną grupę trzech cyfr, myślnik, zapamiętywaną grupę trzech cyfr, myślnik i zapamiętywaną grupę czterech cyfr. Nową częścią jest kolejny myślnik i zapamiętywana grupa jednej lub więcej cyfr. Na końcu jak w poprzednim przykładzie dopasowujemy koniec łańcucha.
# Metoda groups() zwraca teraz krotkę czterech elementów, ponieważ wyrażenie regularne
# Niestety nie jest to wersja ostateczna, gdyż zakładamy, że każda część numeru telefonu jest rozdzielona myślnikiem. Co jeśli będą rozdzielone spacją, kropką albo przecinkiem? Potrzebujemy bardziej ogólnego rozwiązania.
# Ups! Nie tylko to wyrażenie nie robi wszystkiego co powinno, ale
Następny przykład pokazuje wyrażenie regularne, które obsługuje różne separatory między częściami numeru telefonu.
Linia 99:
>>>
# Wzorzec w tym przykładzie jest taki sam jak w poprzednim, z wyjątkiem tego, że teraz na początku łańcucha dopasowujemy \D* przed pierwszą zapamiętywaną grupą (numerem kierunkowym). Zauważ że tych znaków nie zapamiętujemy
# 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
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.
|