Wyrażenia regularne za pomocą Pythona 3

Wyrażenia regularne za pomocą Pythona 3
Wyrażenia regularne są często postrzegane jako ta naprawdę niejasna seria hieroglifów, które zwykle kopiuje się z Internetu i wklej. To tajemnicze zaklęcie pokazuje następnie magiczne możliwości znajdowania wzorów wewnątrz strun tekstu, a jeśli dobrze go zapytamy.

Na przykład, gdy piszesz opiekunów do adresu URL (i Boże, pomóż ci, jeśli piszesz jeden od zera), często chcesz wyświetlić ten sam wynik bez względu na to, że „/”/”w adresie URL. mi.g https: // przykład.com/user/settings/i https: // przykład.COM/Użytkownik/Ustawienia powinny wskazywać na tę samą stronę, pomimo końcowego „/”.

Nie możesz jednak zignorować wszystkich cięć do przodu, na przykład:

  1. Przedstawione przekształcenie między „Użytkownik” i „Ustawienia”, E, „Użytkownik/Ustawienia”.
  2. Będziesz także musiał wziąć pod uwagę „//” na początku swojego FQDN, a następnie „https”.

Więc wymyślasz zasadę, taką jak: „Zignoruj ​​tylko cięcia do przodu, a następnie puste miejsce.”A jeśli chcesz, możesz zakodować tę regułę za pomocą serii instrukcji IF-Else. Ale to będzie dość szybko. Możesz napisać funkcję z napisem CleanURl (), która może to dla Ciebie zamknąć. Ale wszechświat wkrótce zacznie rzucić w ciebie więcej krzywych. Wkrótce zobaczysz, że piszesz funkcje dla Cleanheaders (), processlog () itp. Lub możesz użyć wyrażenia regularnego, gdy wymagane jest jakiekolwiek dopasowanie wzoru.

Standardowe IO i pliki

Zanim przejdziemy do szczegółów wyrażeń regularnych, warto wspomnieć o modelu, który większość systemów ma dla strumieni tekstu. Oto krótkie (niekompletne) podsumowanie tego:

  1. Tekst jest przetwarzany jako (pojedynczy) strumień znaków.
  2. Ten strumień może pochodzić z pliku tekstu Unicode lub ASCII lub ze standardowego wejścia (klawiatura) lub ze zdalnego połączenia sieciowego. Po przetworzeniu, powiedz przez skrypt Regex, dane wyjściowe przechodzi do pliku lub strumienia sieciowego lub standardowego wyjścia (e.G, konsola)
  3. Strumień składa się z jednej lub więcej linii. Każda linia ma zero lub więcej znaków, a następnie nowa linia.

Ze względu na prostotę chcę, żebyś wyobrażał sobie, że plik składa się z linii kończących się nową postacią. Łamiemy ten plik na poszczególne linie (lub struny), które kończą się nową linią lub normalnym znakiem (dla ostatniej linii).

Regexs i String

Regex nie ma nic wspólnego z plikami. Wyobraź to sobie jako czarne skrzynkę, która może traktować jako wprowadzenie dowolnego dowolnego ciągu dowolnej (skończonej) długości, a gdy dotrze do końca tego ciągu, może albo:

  1. Zaakceptuj ciąg. Innymi słowy, ciąg mecze wyrażenie regularne (Regex).
  2. Odrzuć ciąg, i.e, ciąg nie mecz wyrażenie regularne (Regex).

Pomimo jego czarnej natury, dodam jeszcze kilka ograniczeń do tego maszyny. Regex odczytuje ciąg sekwencyjnie, od lewej do prawej i czyta tylko jedną postać na raz. Więc ciąg „Linuxhint” z przeczytaniem jako:

'L "i" n "u" x "h" i "n" t' [od lewej do prawej]

Zacznijmy proste

Najbardziej uproszczonym rodzajem regularności byłoby wyszukiwanie i dopasowanie ciągu „C”. Wyrażenie regularne to po prostu „c”. Całkiem trywialne. Sposób, aby to zrobić w Python, wymagałby najpierw zaimportowania Odnośnie moduł do wyrażeń regularnych.

>>> Importuj ponownie

Następnie używamy funkcji ponownie.szukaj(wzór, ciąg) Gdzie wzór jest naszym wyrażeniem regularnym i strunowy w ciągu wejściowego, w którym szukamy wzoru.

>>> re.Wyszukaj („c”, „to zdanie ma w nim celowe C”)

Funkcja przyjmuje wzór „C”, szuka go w ciągu wejściowego i drukuje lokalizację (rozpiętość) gdzie znaleziono wspomniany wzór. Ta część ciągu, ta podłoże pasuje do naszego wyrażenia regularnego. Gdyby nie znaleziono takiego dopasowania Nic obiekt.

Podobnie możesz wyszukać wzór „wyrażenie regularne” w następujący sposób:

>>> re.Wyszukaj („wyrażenie regularne”, „możemy użyć wyrażeń regularnych do wyszukiwania wzorców.”)

Odnośnie.wyszukiwanie (), re.mecz () i re.FullMatch ()

Trzy przydatne funkcje z modułu Re obejmują:

Odnośnie.szukaj(wzór, ciąg)

Odwraca to podjazd, który pasuje do wzoru, jak widzieliśmy powyżej. Jeśli nie znaleziono żadnego dopasowania, wtedy Nic jest zwrócony. Jeśli wiele podłoża jest zgodnych z danym wzorem, zgłoszono tylko pierwsze występowanie.

Odnośnie.mecz(wzór, ciąg)

Ta funkcja próbuje dopasować dostarczony wzór od początku łańcucha. Jeśli napotka przerwę gdzieś w połowie drogi, powraca Nic.

Na przykład,

>>> re.mecz („Joh”, „John Doe”)

Gdzie jako ciąg „mam na imię John Doe” nie jest dopasowany, a zatem Nic jest zwrócony.

>>> wydrukuj (ponownie.mecz („Joh”, „My Name Is John Doe”))
Nic

Odnośnie.FullMatch (wzór, ciąg)

Jest to bardziej surowsze niż zarówno powyższe, jak i próbuje znaleźć dokładne dopasowanie wzoru w ciągu, w przeciwnym razie domyślnie Nic.

>>> wydrukuj (ponownie.FullMatch („Joh”, „Joh”))

# Wszystko inne nie będzie dopasowane

Będę używać tylko Odnośnie.szukaj() funkcja w pozostałej części tego artykułu. Ilekroć mówię, że Regex akceptuje ten sznurek, oznacza to, że Athe Odnośnie.szukaj() Funkcja znalazła pasującą podłoże w ciągu wejściowego i zwróciła to zamiast tego Nicobiekt.

Znaki specjalne

Wyrażenia regularne, takie jak „John” i „C”, nie są zbytnio użyteczne. Potrzebujemy znaków specjalnych, co określone w kontekście wyrażeń regularnych. Oto kilka przykładów:

    1. ^ - To pasuje do początku ciągu. Na przykład „^c” będzie pasować do wszystkich ciągów, które zaczynają się od litery C.
    2. $ - to pasuje do końca linii.
    3. . - Kropka ma wskazać jeden lub więcej znaków, z wyjątkiem nowej linii.
    4. * - To jest zero lub więcej charakteru tego, co go poprzedziło. Tak więc B* pasuje do 0 lub więcej wystąpień B. AB* pasuje tylko do A, AB i A
    5. + - To jest jeden lub więcej charakteru tego, co go poprzedziło. Tak więc B+ pasuje do 1 lub więcej wystąpień B. AB* pasuje tylko do A, AB i A
    6. \ - BackSlash jest używany jako sekwencja ucieczki w wyrażeniach regulatorowych. Więc chcesz, aby wyrażenie regularne poszukiwał dosłownej obecności symbolu dolara „$” zamiast końca linii. Możesz napisać \ $ w wyrażeniu regularnym.
    7. Do określenia liczby powtórzeń, które chcesz zobaczyć. Na przykład wzór taki jak AB 10 oznacza ciąg, a następnie 10 B, będzie pasował do tego wzoru. Możesz również określić zakres liczb, takich jak B 4,6 pasuje do ciągów zawierających B powtarzane 4 do 6 razy kolejno. Wzór dla 4 lub więcej powtórzeń wymagałby tylko trwającego przecinka, tak jak B 4,
    8. Kwadratowe wsporniki i zakres znaków. Jak [0-9] może działać jak symbol zastępczy dla dowolnej cyfry od 0 do 9. Podobnie możesz mieć cyfry od jednego do pięciu [1-5] lub dopasować dowolne wielkie litery [A-Z] lub dla dowolnej litery alfabetu, niezależnie od tego, że jest ono użycie górnych lub małej litery [A-Z].
      Na przykład każdy ciąg wykonany dokładnie z dziesięciu cyfr odpowiada wyrażeniu regularne [0-9] 10, całkiem przydatne, gdy szukasz numerów telefonów w danym ciągu.
    9. Możesz utworzyć instrukcję lub podobną, używając | charakter, w którym wyrażenie regularne składa się z dwóch lub więcej wyrażeń regularnych, powiedzmy, a i b. Regex A | B jest dopasowany, jeśli ciąg wejściowy jest dopasowany do wyrażenia regularnego A lub dla B.
    10. Możesz grupować różne wyrażenia regularne razem. Na przykład Regex (A | B) C będzie pasował do regularności AC i

Jest o wiele więcej do omówienia, ale polecam uczyć się, jak idziesz zamiast przeciążać mózg z wieloma niejasnymi symbolami i skrzynkami. W razie wątpliwości dokumenty Pythona są wielką pomocą, a teraz wiesz wystarczająco dużo, aby łatwo śledzić dokumenty.

Ręce za doświadczenie i referencje

Jeśli chcesz zobaczyć wizualną interpretację swojego wyrażenia, możesz odwiedzić Debuggex. Ta strona generuje widok regex w czasie rzeczywistym i pozwala przetestować ją na różnych ciągach wejściowych.

Aby dowiedzieć się więcej o teoretycznym aspekcie wyrażeń regularnych, możesz chcieć spojrzeć na pierwsze kilka rozdziałów wprowadzenia do teorii obliczeń autorstwa Michaela Sipsera. Jest bardzo łatwy do naśladowania i pokazuje znaczenie wyrażeń regularnych jako podstawowej koncepcji samej obliczeń!