Wyrażenia regularne Pythona z przykładami

Wyrażenia regularne Pythona z przykładami

Wyrażenie regularne (często skrócone do „Regex”) jest techniką i wzorem tekstowym, który określa, w jaki sposób chce się wyszukać lub zmodyfikować dany ciąg. Wyrażenia regularne są powszechnie stosowane w skonstrukcjach powłoki bash i w kodzie Python, a także w różnych innych językach programowania.

W tym samouczku nauczysz się:

  • Jak zacząć od wyrażeń regularnych na Python
  • Jak zaimportować moduł Regex Python
  • Jak dopasować struny i znaki za pomocą notacji Regex
  • Jak korzystać z najczęstszych notacji Regex Python
Wyrażenia regularne Pythona z przykładami

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Każdy system operacyjny GNU/Linux
Oprogramowanie Python 2, Python 3
Inny Uprzywilejowany dostęp do systemu Linux jako root lub za pośrednictwem sudo Komenda.
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Przykłady wyrażeń regularnych Python

W Pythonie chce się zaimportować Odnośnie moduł umożliwiający użycie wyrażeń regularnych.

Przykład 1 zacznijmy od prostego przykładu:

$ Python3 Python 3.8.2 (domyślnie, 27 kwietnia 2020, 15:53:34) [GCC 9.3.0] w typu Linux „Pomoc”, „Copyright”, „Kredyty” lub „licencja”, aby uzyskać więcej informacji. >>> Drukuj („Hello World”) Hello World >>> Importuj Re >>> Drukuj (ponownie.mecz ('^.','Witaj świecie')) 
Kopiuj

Tutaj po raz pierwszy wydrukowaliśmy Witaj świecie Linia 5to Pokazaj prostą konfigurację drukowania. Następnie zaimportowaliśmy moduł Regex Odnośnie Linia 7Enbing nas do korzystania z .mecz Funkcja linii wyrażenia regularnego 8 -mecz tej biblioteki.

Składnia .mecz Funkcja to (wzór, ciąg), w którym wzorzec zdefiniowano jako wyrażenie regularne ^.'I użyliśmy tego samego Witaj świecie ciąg jako nasz ciąg wejściowy.

Jak widać, w liście znaleziono mecz H. Powodem tego meczu jest wzór wyrażenia regularnego, a mianowicie; ^ oznacza Początek ciągu I . oznacza Dopasuj dowolną postać (z wyjątkiem Newline).

Zatem, H znaleziono, ponieważ litera ta jest bezpośrednio po „rozpoczęciu ciągu” i jest opisana jako „dowolna postać, H w tym przypadku".

CZY WIEDZIAŁEŚ?
Te szczególne konotacje są identyczne z wyrażeniami regularnymi w skryptach BASH, a inne aplikacje uwzględniające regex, których wszystkie używają bardziej lub mniej uuznotania standardu regularnego wyrażenia, chociaż istnieją różnice między językami, a nawet konkretnymi implementacjami, jeśli zagłębiasz się w wyrażenia regularne dalej.

Przykład 2

>>> wydrukuj (ponownie.mecz („… W”, „Hello World”)) 
Kopiuj

Tutaj używamy . Aby dopasować dowolną postać (z wyjątkiem Newline) i robimy to 6 razy przed dopasowaniem dosłownego charakteru W.

Jak widzisz Witam w (7 znaków) zostało dopasowane. Co ciekawe, ten program jako rozprzestrzeni się (0,7), którego nie należy odczytać jako 0-7 (czyli 8 znaków), ale jako „zacznij od 0” „+7 znaków”, jak można również zerkać z innych przykładów w tym artykuł.

Przykład 3 weźmy kolejny, nieco bardziej złożony przykład:

>>> wydrukuj (ponownie.mecz ('^h [elo]+', „hello świat”))) 
Kopiuj

Składnia w tym przypadku jest:

  • ^: Jak opisano powyżej, można również odczytać jako „to musi być początek ciągu”
  • H: musi pasować H W tej dokładnej lokalizacji (która jest bezpośrednio po/na początku łańcucha)
  • [Elo]+: Dopasuj też mi,L Lub o („albo” zdefiniowane przez [' I ']) I + oznacza „jeden lub więcej z nich”

Zatem, Cześć był dopasowany jako H był rzeczywiście na początku sznurka i mi I o I L zostały dopasowane jeden lub więcej razy (w dowolnej kolejności).

Przykład trzech dla super złożonego?

>>> wydrukuj (ponownie.findall ('^[he]+ll [o \ t]+wo [rl].+$ ', „Hello World”)) [„Hello World”];
Kopiuj

Tutaj użyliśmy innej funkcji modułu Re, a mianowicie Znajdź wszystko który natychmiast daje znaleziony ciąg i używa tej samej składni (wzór, ciąg).

Dlaczego zrobił Witaj świecie Dopasuj w całości? Złammy to krok po kroku:

  • ^: Początek ciągu
  • [On]+: Mecze H I mi 1 lub więcej razy, a zatem On jest dopasowany
  • ll: dosłowne dopasowanie ll w tym dokładnym miejscu, a zatem rzeczywiście ll jest dopasowany, ponieważ pojawił się bezpośrednio On
  • [o \ t]+: Dopasuj też " (przestrzeń) lub o, Lub \T (karta) i to 1 lub więcej razy, a zatem o (o przestrzeń) dopasowane. Gdybyśmy użyli zakładki zamiast przestrzeni, ten regex nadal działałby!
  • Wo: Dosłowny mecz Wo
  • [rl]: Dopasuj też R Lub L. Patrz uważnie; tylko R jest dopasowany tutaj! Nie ma + za ] Więc tylko jedna postać, R Lub L zostanie dopasowany w tej pozycji. Więc dlaczego rld Wciąż dopasowane? Odpowiedź jest w następnym kwalifikacjach;
  • .+: Dopasuj dowolną postać (oznaczoną przez .) jeden lub więcej razy L I D oba są dopasowane, a nasz ciąg jest kompletny
  • $: Podobny do ^, Ta postać oznacza „koniec ciągu”.

Innymi słowy, gdybyśmy umieścili to na początku, czy gdzie indziej pośrodku, Regex byłby niedopasowany.

Jako przykład:

>>> wydrukuj (ponownie.FINDALL ('^Hello $', „Hello World ')) [] >>> drukuj (rep.findall ('^hello $', 'hello')) [] >>> drukuj (rep.findall ('^hello $', 'hello')) ['hello'] >>> drukuj (rep.Findall („^Hello”, „Hello World”)) [„Hello”]
Kopiuj

Tutaj nie zwracano żadnego wyjścia dla dwóch pierwszych druków, ponieważ próbujemy dopasować ciąg, który można odczytać jako „start_of_string”-Cześć-„End_of_string”, jak oznaczono przez ^Witaj $, przeciwko Witaj świecie który nie pasuje.

W trzecim przykładzie ^Witaj $ mecze Cześć Ponieważ w żadnych dodatkowych znakach w Cześć ciąg, który spowodowałby, że ten regular. Wreszcie, ostatni przykład pokazuje częściowe dopasowanie bez wymogu „end_of_string” ($).

Widzieć? Już stajesz się ekspertem od wyrażeń regularnych! Wyrażenia regularne mogą być zabawne i są bardzo potężne!

Przykład 4
Istnieją różne inne funkcje w Odnośnie Moduł Python, jak Odnośnie.pod, Odnośnie.podział, Odnośnie.Subn, Odnośnie.szukaj, każdy z odpowiednimi domenami przypadków użycia. Spójrzmy na Re.Sub następny:

>>> wydrukuj (ponownie.sub („^hello”, „pa pa”, „hello świat”)) pa pa
Kopiuj

String String Siptitution jest jedną z najpotężniejszych zastosowań wyrażeń regularnych, w Python i innych językach kodowania. W tym przykładzie szukaliśmy ^Witam i zastąpił to PA pa w ciągu Witaj świecie. Czy widzisz, jak byłoby to bardzo przydatne do przetwarzania wszelkiego rodzaju zmiennych i strun tekstowych, a nawet całego płaskiego plików tekstowych?



Przykład 5
Spójrzmy na kilka bardziej złożonych przykładów, używając bardziej zaawansowanej składni Regex:

>>> wydrukuj (ponownie.sub („[0-9]+”, „_”, „Hello World 123”)) Hello World _
Kopiuj
  • [0-9]+: Dowolny znak numeryczny z 0 Do 9, jeden lub więcej razy.

Czy widzisz, jak 123 został zastąpiony jednym _ ?

Przykład 6

>>> wydrukuj (ponownie.pod('(?i) [O-r]+', „_”, „Hello World 123”)) Hell_ W_ld 123
Kopiuj
  • (?i) [O-r]+: Dopasuj jeden lub więcej O Do R lub - dzięki opcjonalnemu I flaga - o Do R
  • (?I): ustawiaj wrażliwość na przypadek I flaga dla tego wzoru
>>> wydrukuj (ponownie.sub ('[1] 2', '_', „Hello World 111 ')) Hello World _1
Kopiuj
  • [1] 2: Dopasuj postać 1 Dokładnie dwa razy

Przykład 7

>>> wydrukuj (ponownie.sub („(świat)”, „\ g \ g”, „hello świat 123”)) Hello Worldworld 123
Kopiuj
  • (Świat): Dopasuj dosłowny tekst „świat” i uczyń go grupą, która może być użyta w zastąpieniu
  • \ g \ g: \G Określa pierwszą grupę, która została dopasowana, ja.mi. tekst Świat zaczerpnięte z Hello World 123 ciąg, i jest to powtarzane dwa razy, co powoduje Światowy świat wyjście. /li>

Przykład 8

Aby uczynić to jasniej, rozważ następujące dwa przykłady:

>>> wydrukuj (ponownie.sub ('(o)', '\ g \ g \ g', „hello świat 123 ')) hellooo wooorld 123
Kopiuj

W tym pierwszym przykładzie po prostu pasujemy o i umieść go w grupie, a następnie powtórz tę grupę trzy razy na zewnątrz.

Zauważ, że gdybyśmy nie odwoływali się do grupy 1 (pierwsza dopasowana grupa, drugi przykład Ref), po prostu nie byłoby wyjścia, a wynik byłby:

>>> wydrukuj (ponownie.sub („(o)”, ”,„ Hello World 123 ”)) Hell Wrld 123
Kopiuj

W drugim przykładzie rozważ:

>>> wydrukuj (ponownie.sub ('(o).*(r) ', „\ g \ g”, „Hello World 123”)) Hellorld 123
Kopiuj

Tutaj mamy dwie grupy, pierwsza o (Gdziekolwiek taka grupa pasuje, a jest to wyraźnie wiele, jak widać w pierwszym przykładzie), a druga istota R. Dodatkowo używamy .* co przekłada się na „dowolną postać, dowolną liczbę razy” - często używane wyrażenie regularne.

Więc w tym przykładzie O Wor jest dopasowany przez (o).*(r) '(' o Najpierw, potem dowolna postać do ostatniej R został osiągnięty. Pojęcie „ostatnie” jest bardzo importowane i jest łatwe do popełnienia błędu/gejcha, szczególnie dla nowych użytkowników wyrażeń regularnych. Jako przykład, rozważ:

>>> wydrukuj (ponownie.sub ('e.*o ', „_”, „Hello World 123”)) h_rld 123
Kopiuj

Czy widzisz, jak ostatni o został dopasowany?

Powrót do naszego przykładu:

>>> wydrukuj (ponownie.sub ('(o).*(r) ', „\ g \ g”, „Hello World 123”)) Hellorld 123
Kopiuj

Widzimy to O Wor został zastąpiony meczem grupy 1, a następnie meczu grupy 2, w wyniku czego: O Wor zastępowane przez Lub a zatem wyjście jest Hellorld 123.



Wniosek

Spójrzmy na niektóre z najczęstszych notacji wyrażeń regularnych dostępnych w Python, dopasowane do niektórych lekkich implementacji tego samego:

Lista najczęstszych notacji ekspresji regularnej Pythona
Notacja Regex Opis
. Każda postać, z wyjątkiem nowości
[a-c] Jeden znak wybranego zakresu, w tym przypadku A, B, C
[A-Z] Jeden znak wybranego zakresu, w tym przypadku A-Z
[0-9af-z] Jeden znak wybranego zakresu, w tym przypadku 0-9, a i f-z
[^A-za-z] Jedna postać poza wybranym zakresem, w tym przypadku na przykład „1” kwalifikowałby się
* Dowolna liczba meczów (0 lub więcej)
+ 1 lub więcej meczów
? 0 lub 1 dopasowanie
3 Dokładnie 3 mecze
() Grupa przechwytywania. Po raz pierwszy jest to używane, liczba grupy to 1 itp.
\G Użyj (wstaw) grupy Capture Match, kwalifikowana przez liczbę (1-x) grupy
\G Grupa specjalna 0 wstawia cały dopasowany ciąg
^ Początek ciągu
$ Koniec ciągu
\D Jedna cyfra
\D Jeden nie cyfr
\S Jedna biała oddział
\S Jedna nie-biała
(?I) Zignoruj ​​prefiks flagi, jak pokazano powyżej
a | d Jedna postać z nich (alternatywa dla używania []), „a” lub „d”
\ Ucieka z postaciami specjalnymi
\B Postać backspace
\N Nowa postać
\R Znak powrotu powozu
\T Znak tablicy

Ciekawy? Gdy zaczniesz używać wyrażeń regularnych, w dowolnym języku, wkrótce przekonasz się, że zaczniesz je używać wszędzie - w innych językach kodowania, w ulubionym edytorze tekstu, w wierszu poleceń (patrz „SED” dla użytkowników Linux), itp.

Prawdopodobnie przekonasz się, że zaczniesz używać ich bardziej ad hoc, ja.mi. Nie tylko w kodowaniu. Istnieje coś z natury potężnego, aby móc kontrolować wszelkiego rodzaju wyjście wiersza poleceń, na przykład list katalogu i plików, skryptowanie i zarządzanie tekstem z płaskiego pliku.

Ciesz się postępami w nauce i opublikuj poniżej niektóre z najpotężniejszych przykładów wyrażenia regularnego!



Powiązane samouczki Linux:

  • Advanced Bash Regex z przykładami
  • Bash Regexps dla początkujących z przykładami
  • Mastering Bash Script Loops
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Zagnieżdżone pętle w skryptach Bash
  • Manipulacja Big Data dla zabawy i zysku Część 3
  • Obsługa danych wejściowych użytkownika w skryptach Bash
  • Utwórz przekieruj i przepisuj reguły do .Htaccess na Apache…
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?