Być może znasz wyszukiwanie tekstu poprzez naciśnięcie klawiszy Ctrl-F i wpisanie szukanych słów. Wyrażenia regularne idą o krok dalej: pozwalają określić wzór wyszukiwanego tekstu. W tym artykule zobaczymy, jak dopasowywanie wzorców w Pythonie współpracuje z Regexem.
Regex w Pythonie
Wyrażenia regularne , nazywane również wyrażenie regularne , są opisami wzorca tekstu. Może wykryć obecność lub brak tekstu, dopasowując go do określonego wzorca, a także może podzielić wzorzec na jeden lub więcej wzorców podrzędnych. Na przykład: D w wyrażeniu regularnym oznacza cyfrę — czyli dowolną pojedynczą cyfrę od 0 do 9.
Sprawdź numery telefonów za pomocą wyrażenia regularnego w Pythonie
Następujące wyrażenie regularne jest używane w Pyton aby dopasować ciąg trzech liczb, łącznika, trzech kolejnych liczb, kolejnego łącznika i czterech liczb.
Any other string would not match the pattern. ddd-ddd-dddd>
Wyrażenia regularne mogą być znacznie bardziej wyrafinowane. Na przykład dodanie 3 w nawiasach klamrowych ({3}) po wzorcu jest jak powiedzenie: Dopasuj ten wzorzec trzy razy. Zatem nieco krótsze wyrażenie regularne wygląda następująco:
zamiar zamiar
d{3}-d{3}-d{4}> Pasuje do prawidłowego formatu numeru telefonu.
Dopasowywanie wzorców za pomocą wyrażeń regularnych
Obiekt Regex szukaj() Metoda przeszukuje przekazany ciąg znaków pod kątem dopasowań do wyrażenia regularnego. Obiekty dopasowania mają metodę group(), która zwraca faktycznie dopasowany tekst z przeszukiwanego ciągu. Możesz także zobaczyćArkusz Regexpo więcej informacji.
Przykład: Zaimportuj moduł regex za pomocą import re. Utwórz obiekt Regex za pomocąponownie.kompiluj()funkcjonować. (Pamiętaj, aby użyć nieprzetworzonego ciągu). Przekaż ciąg, który chcesz przeszukać, do metody search() obiektu Regex. Zwraca to obiekt Match. Wywołaj metodę group() obiektu Match, aby zwrócić ciąg faktycznie dopasowanego tekstu.
Python3
# Python program to illustrate> # Matching regex objects> import> re> > # regex object> phoneNumRegex>=> re.>compile>(r>'ddd-ddd-dddd'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(>'Phone number found: '> +> mo.group())> |
>
>
Wyjście:
Phone number found: 415-555-4242>
Nawiasy do grupowania i przechwytywania za pomocą wyrażenia regularnego
Jednym ze sposobów dopasowywania wzorców za pomocą wyrażenia regularnego jest użycie nawiasów wokół wzorców. Dla lepszego zrozumienia przeanalizujmy kilka różnych przykładów.
Dopasowywanie obiektów
Załóżmy, że chcesz oddzielić numer kierunkowy od reszty numeru telefonu. Dodanie nawiasów spowoduje utworzenie grup w wyrażeniu regularnym: (ddd)-(ddd-dddd). Następnie możesz użyć metody obiektu dopasowania group(), aby pobrać pasujący tekst tylko z jednej grupy.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.group(>1>))> areaCode, number>=> mo.groups()> print>(>'area code:'>, areaCode)> print>(>'number:'>, number)> |
>
>
Wyjście:
415 area code: 415 number: 555-4242>
Pobierz wszystkie grupy na raz
Jeśli chcesz pobrać wszystkie grupy na raz, użyj metody groups(), — zwróć uwagę na liczbę mnogą nazwy.
Python3
import> re> phoneNumRegex>=> re.>compile>(r>'(ddd)-(ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My number is 415-555-4242.'>)> print>(mo.groups())> |
>
>
Wyjście:
('415', '555-4242')> Dopasuj nawias
Nawiasy mają specjalne znaczenie w wyrażeniach regularnych, ale co zrobić, jeśli trzeba dopasować nawias w tekście. Może na przykład numery telefonów, które próbujesz dopasować, mają numer kierunkowy podany w nawiasach. W takim przypadku należy uciec przed znakami ( i ) za pomocą ukośnika odwrotnego. Wpisz następujące dane w interaktywnej powłoce:
Python3
przekonwertuj ciąg na znak
import> re> phoneNumRegex>=> re.>compile>(r>'((ddd)) (ddd-dddd)'>)> mo>=> phoneNumRegex.search(>'My phone number is (415) 555-4242.'>)> print>(mo.group(>1>))> |
>
>
Wyjście:
(415)>
Znaki ucieczki ( i ) w nieprzetworzonym ciągu znaków przekazanym do re.compile() będą odpowiadać rzeczywistym znakom nawiasów.
Wyrażenia regularne: grupowanie i znak potoku
The | znak nazywany jest potokiem. Możemy go używać wszędzie tam, gdzie chcemy dopasować jedno z wielu wyrażeń.
Przykład: Wyrażenie regularne r’Batman|Tina Fey” będzie pasować do „Batman” lub „Tina Fey”. Gdy w przeszukiwanym ciągu wystąpią zarówno Batman, jak i Tina Fey, pierwsze wystąpienie pasującego tekstu zostanie zwrócone jako obiekt Match.
Python3
# Python program to illustrate> # Matching regex objects> # with multiple Groups with the Pipe> import> re> heroRegex>=> re.>compile> (r>'Batman|Tina Fey'>)> mo1>=> heroRegex.search(>'Batman and Tina Fey.'>)> print>(mo1.group())> |
>
>
Wyjście:
'Batman'>
Zrozumienie nawiasów klamrowych w wyrażeniu regularnym
Jeśli mamy grupę, którą chcemy powtórzyć określoną liczbę razy, po grupie w wyrażeniu regularnym wpisz liczbę w nawiasach klamrowych.
Na przykład wyrażenie regularne (Ha){3} będzie pasować do ciągu „HaHaHa”, ale nie będzie pasować do „HaHa”, ponieważ to drugie ma tylko dwa powtórzenia grupy (Ha). Zamiast jednej liczby możesz określić zakres pomiędzy nawiasami klamrowymi. Wyrażenie regularne (Ha){3, 5} będzie pasować do „HaHaHa”, „HaHaHaHa” i „HaHaHaHaHa”. Możesz także pominąć pierwszą lub drugą liczbę w nawiasach klamrowych, aby pozostawić minimum lub maksimum nieograniczone. (Ha){3, } będzie pasować do trzech lub więcej wystąpień grupy (Ha), podczas gdy (Ha){, 5} będzie pasować od zera do pięciu wystąpień. Nawiasy klamrowe mogą pomóc w skróceniu wyrażeń regularnych.
Przykład 1: W tym przykładzie użyjemy nawiasów klamrowych do określenia wystąpienia szukanego wzorca.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo1>=> haRegex.search(>'HaHaHa'>)> print>(mo1.group())> |
>
>
Wyjście:
HaHaHa>
Przykład 2: W tym przykładzie zdefiniujemy wystąpienie wzorca za pomocą nawiasów klamrowych, a następnie wyszukamy, czy istnieje w nim konkretny wzór, czy nie.
Python3
# Python program to illustrate> # Matching Specific Repetitions> # with Curly Brackets> import> re> haRegex>=> re.>compile>(r>'(Ha){3}'>)> mo2>=> haRegex.search(>'Ha'>)>=>=> None> print>(mo2)> |
>
format daty.format Java
>
Wyjście:
True>
Operator opcjonalny lub znak zapytania (?) w wyrażeniu regularnym
Czasami pojawia się wzór, który chcesz dopasować tylko opcjonalnie. Oznacza to, że wyrażenie regularne powinno znaleźć dopasowanie niezależnie od tego, czy ten fragment tekstu tam jest, czy nie. The ? znak flaguje grupę, która go poprzedza, jako opcjonalną część wzorca.
Przykład 1: Tutaj będziemy szukać wzoru z motywem „Batman” lub „Batwoman”. The (Gdzie)? część wyrażenia regularnego oznacza, że wzorzec wo jest grupą opcjonalną. Wyrażenie regularne dopasuje tekst, który ma zero wystąpień lub jedno wystąpienie wo. Dlatego wyrażenie regularne pasuje zarówno do słów „Batwoman”, jak i „Batman”. Możesz pomyśleć o? jak powiedział, grupy Dopasuj zero lub jedną z grup poprzedzających ten znak zapytania.
Jeśli chcesz dopasować rzeczywisty znak zapytania, użyj znaku ?.
Python3
# Python program to illustrate> # optional matching> # with question mark(?)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)?man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> print>(mo2.group())> |
>
>
Wyjście:
Batman Batwoman>
Zero lub więcej dopasowania wzorca z gwiazdą
Znak * (zwany gwiazdką lub gwiazdką) oznacza dopasuj zero lub więcej — grupa poprzedzająca gwiazdkę może wystąpić w tekście dowolną liczbę razy. Może być całkowicie nieobecny lub powtarzany w kółko. Jeśli chcesz dopasować rzeczywisty znak gwiazdy, poprzedź gwiazdę w wyrażeniu regularnym ukośnikiem odwrotnym, *.
Przykład 1: W tym przykładzie dopasujemy zero wystąpień wzorca w ciągu. Część (wo)* wyrażenia regularnego pasuje do zera wystąpień wo w ciągu.
Python3
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo1>=> batRegex.search(>'The Adventures of Batman'>)> print>(mo1.group())> |
>
>
Wyjście:
Batman>
Przykład 2: W tym przykładzie dopasujemy co najmniej jedno wystąpienie wzorca w ciągu znaków.
Pyton
#python program to illustrate> #matching a regular expression> #with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo2>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo2.group())> |
>
>
Wyjście:
Batwoman>
Przykład 3: W tym przykładzie dopasujemy więcej niż jedno wystąpienie wzorca w ciągu.
Pyton
poradnik hadoopa
# Python program to illustrate> # matching a regular expression> # with asterisk(*)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)*man'>)> mo3>=> batRegex.search(>'The Adventures of Batwowowowoman'>)> print>(mo3.group())> |
>
>
Wyjście:
Batwowowowoman>
Jeden lub więcej pasujących wzorców z plusem
Chwila * oznacza dopasuj zero lub więcej , + (lub plus) oznacza dopasuj jeden lub więcej. W przeciwieństwie do gwiazdy, która nie wymaga, aby jej grupa pojawiała się w dopasowanym ciągu, grupa poprzedzająca plus musi pojawić się co najmniej raz. Nie jest to opcjonalne. Jeśli chcesz dopasować rzeczywisty znak plus, poprzedź znak plus ukośnikiem odwrotnym, aby go uniknąć: +.
Przykład 1: W tym przykładzie dopasujemy co najmniej jedno wystąpienie wzorca w ciągu znaków.
Python3
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo1>=> batRegex.search(>'The Adventures of Batwoman'>)> print>(mo1.group())> |
>
>
Wyjście:
Batwoman>
Przykład 2: W tym przykładzie wyrażenie regularne Bat(wo)+man nie będzie pasować do ciągu „Przygody Batmana”, ponieważ znak plus wymaga co najmniej jednego wo.
jak sparować słuchawki Beats
Pyton
# Python program to illustrate> # matching a regular expression> # with plus(+)> import> re> batRegex>=> re.>compile>(r>'Bat(wo)+man'>)> mo3>=> batRegex.search(>'The Adventures of Batman'>)>=>=> None> print>(mo3)> |
>
>
Wyjście:
True>
Powiązany artykuł – Arkusz Regex