Zanurkuj w Pythonie/Analiza przypadku: Przetwarzanie numerów telefonów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Robwolfe (dyskusja | edycje)
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 on (1234).
 
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). UmieszczoneUmieszczenie ich w nawiasach oznacza "dopasuj dokładnie 3 cyfry, i zapamiętaj je jako grupę, o którą mogę zapytać później". Potem dopasuj myślnik. Dalej dopasuj kolejną grupę dokładnie trzech cyfr, kolejny myślnik, i ostatnią grupę tym razem czterech cyfr. Na koniec dopasuj koniec łańcucha znaków.
# Aby otrzymać grupy które zapamięta moduł przetwarzania wyrażeń regularnych, należy skorzystać z metody groups() obiektu zwracanego przez funkcję szukającą<tt>search</tt>. Zwróci ona krotkę z taką ilością elementów jaka ilość grup została zdefiniowana w wyrażeniu regularnym. W tym przypadku mamy trzy grupy: dwie po 3 cyfry i ostatnią czterocyfrową.
# 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 zapamiętujedefiniuje teraz cztery elementygrupy do zapamiętania.
# 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 cofneliśmycofnęliśmy się wstecz, gdyż teraz nie dopasowuje ono numerów bez numeru wewnętrznego. To nie jest to co chcieliśmy; jeśli w numerze jest podany numer wewnętrzny, to chcemy go znać, ale jeśli go nie ma, to i tak chcemy znać inne części numeru telefonu.
 
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 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 siesię 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.