Wyrażenia regularne w Pythonie

Wyrażenia regularne w Pythonie

Ten artykuł wyjaśnia wyrażenia regularne w Pythonie.

Omówimy szeroki zakres tematów, od podstawowego użycia modułu re po złożone dopasowywanie wzorców wyrażeń regularnych.

YouTube Video

Wyrażenia regularne w Pythonie

Moduł re służy do wyszukiwania i manipulowania ciągami znaków za pomocą wyrażeń regularnych.

Czym jest moduł re?

Moduł re jest częścią standardowej biblioteki Pythona i zapewnia funkcje do manipulacji ciągami znaków za pomocą wyrażeń regularnych. Wyrażenia regularne służą do efektywnego wyszukiwania, wyodrębniania lub zastępowania określonych wzorców ciągów znaków.

Podstawowe wzorce wyrażeń regularnych

Wyrażenia regularne definiują wzorce za pomocą specjalnych symboli. Poniżej znajdują się przykładowe podstawowe wzorce.

  • .: Dowolny pojedynczy znak
  • ^: Początek ciągu
  • $: Koniec ciągu
  • \d: Dowolna cyfra (0-9)
  • \w: Dowolny znak słowa (a-z, A-Z, 0-9, _)
  • \s: Dowolny znak odstępu
  • *: Zero lub więcej powtórzeń
  • +: Jedno lub więcej powtórzeń
  • []: Klasa znaków (np. [a-z] dopasowuje małe litery alfabetu)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • Ten kod najpierw sprawdza, czy łańcuch pasuje do wzorca kodu pocztowego. Następnie sprawdza, czy cały łańcuch (od początku do końca) pasuje do wzorca złożonego ze słowa, znaku odstępu, cyfr, znaku odstępu oraz angielskiego słowa. To pomaga zrozumieć, jak można łączyć podstawowe elementy wyrażeń regularnych.

Jak używać funkcji dopasowania

re.match()

re.match() sprawdza, czy początek ciągu pasuje do określonego wzorca.

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • Ten kod sprawdza, czy łańcuch zaczyna się od znaku słowa (znaku alfanumerycznego lub podkreślenia). Pierwsze słowo 'Python' pasuje do wzorca i zostaje wypisane.

re.search()

re.search() przeszukuje cały ciąg znaków i zwraca pierwsze dopasowanie.

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • Ten kod przeszukuje cały łańcuch w poszukiwaniu słowa 'powerful' i zwraca pierwsze dopasowanie. W rezultacie re.search() zwraca dopasowany łańcuch 'powerful'.

re.findall()

re.findall() zwraca wszystkie dopasowania wzorca jako listę.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • Ten kod znajduje wszystkie słowa mające dokładnie sześć znaków i zwraca je jako listę. 'Python' w łańcuchu spełnia warunek i zostaje zwrócona lista ['Python'].

re.finditer()

re.finditer() zwraca wszystkie dopasowania jako iterator, co umożliwia uzyskanie szczegółowych informacji o każdym dopasowaniu.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • Ten kod wyszukuje kolejno wszystkie sześcioliterowe słowa i przetwarza każde dopasowanie za pomocą iteratora. 'Python' pasuje tu do wzorca i zostaje wypisany.

Zamiana i Dzielenie

re.sub()

re.sub() zastępuje części ciągu znaków, które pasują do wyrażenia regularnego, innym ciągiem.

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • Ten kod zastępuje wszystkie cyfry w łańcuchu słowem 'many'.

re.split()

re.split() dzieli ciąg znaków w miejscach pasujących do wyrażenia regularnego.

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • Ten kod dzieli łańcuch według jednego lub większej liczby białych znaków. W rezultacie łańcuch zostaje podzielony na słowa, co daje ['Python', 'is', 'powerful'].

Grupy i Przechwytywanie

Używanie grupowania w wyrażeniach regularnych ułatwia wyodrębnianie pasujących podciągów. Umieszczenie w nawiasach () daje możliwość przechwycenia tego jako grupę.

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • Ten kod wyodrębnia 3-cyfrową i 4-cyfrową liczbę jako osobne grupy z kodu pocztowego w postaci '123-4567'. group(1) zwraca pierwsze trzy cyfry '123', a group(2) zwraca ostatnie cztery cyfry '4567'.

Grupy nazwane

Użycie grup nazwanych pozwala pobierać wartości po znaczących nazwach zamiast polegać na indeksach. Poniżej znajduje się konkretny przykład, który wyodrębnia datę i poziom z logu.

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • Ten kod używa grup nazwanych do wyodrębnienia daty, czasu, poziomu i komunikatu z łańcucha logu. Pobiera wartości, używając znaczących nazw zamiast indeksów.

Korzystanie z Opcji Flagi

Moduł re ma kilka opcji flag, aby kontrolować sposób wyszukiwania.

  • re.IGNORECASE (re.I): Opcja flagi, która sprawia, że dopasowanie ignoruje wielkość liter.
  • re.MULTILINE (re.M): Opcja flagi, która umożliwia dopasowanie w wielu liniach.
  • re.DOTALL (re.S): Opcja flagi, w której kropka . dopasowuje również znaki nowej linii.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • Ten kod wyszukuje słowo 'python' bez rozróżniania wielkości liter. Dzięki użyciu flagi re.IGNORECASE dopasuje także 'Python'.

Zalety obiektów wyrażeń regularnych (re.compile)

Skompilowanie wzorca przy użyciu re.compile zwiększa wydajność przy ponownym użyciu i poprawia czytelność. Tutaj można również ustawić flagi.

Poniższy przykład wielokrotnie wyszukuje dopasowania w wielu liniach, używając skompilowanego wzorca. Jeśli często używasz tego samego wzorca, skompilowanie go przy użyciu re.compile poprawia wydajność.

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • Ten kod używa skompilowanego wyrażenia regularnego do wyodrębniania nazw użytkowników i identyfikatorów z wielu linii. re.compile zwiększa efektywność przy ponownym użyciu tego samego wzorca, a także czyni kod bardziej czytelnym.

Zastosowania

Na przykład, rozważ skrypt, który wyodrębnia wszystkie adresy email z pliku tekstowego.

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • Ten kod znajduje wszystkie adresy e-mail w łańcuchu i wyodrębnia je jako listę.

Wnioski

Moduł re to potężne narzędzie do manipulowania ciągami znaków w Pythonie. Tutaj omówiliśmy szeroki zakres tematów, od podstawowego użycia po zaawansowane wyrażenia regularne z użyciem grupowania i opcji flag. Wyrażenia regularne w Pythonie są bardzo potężne i stanowią niezbędne narzędzie do przetwarzania tekstu.

Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.

YouTube Video