Python: Wyrażenia regularne – moduł re (regex)

14-Lut-2018

O wyrażeniach regularnych pisałem już tutaj: https://www.mobilo24.eu/wyrazenia-regularne-bardzo-krotki-przewodnik/

Teraz parę słów o wyszukiwaniu w napisie liczb z wykorzystaniem regular expressions (regex) w Pythonie:

Ilekroć chcesz pracować z wyrażeniami regularnymi zacznij od zaimportowania modułu re

import re

Załóżmy, że mamy do czynienia z napisem „OSTP 288” i chcemy wyciągnąć z niego 288. Po kolei należy:

  • korzystając z funkcji re.compile utworzyć prekompilowane wyrażenie regularne
  • korzystając z funkcji re.match przeprowadzić wyszukiwanie wyrażeń pasujących do maski
  • wynik(i) są dostępne za pomocą metody groups(). Jeśli coś zostało znalezione, to wszystkie pasujące dopasowania znajdą się właśnie tutaj
  • a wyrażenie regularne? Tutaj mówi tak
    • .* – ma być dowolny ciąg dowolnych znaków
    • (\d+) – tutaj jest zdefiniowana grupa dopasowania – o tym świadczą () – i tu zostanie zakwalifikowana jedna lub więcej + cyfra \d
    • .* – a potem ma być znowu dowolna ilość dowolnych znaków:
a_text="OSTP 288"
re_expression = re.compile('.*(\d+).*')
re_result = re.match(re_expression,a_text)
re_result.groups()

To teraz przyjmijmy że mamy do czynienia z napisem ‚1234/5678’. Chcemy wydobyć liczby przed i po /. Właściwie czynności do wykonania są takie same, może tylko wyrażenie regularne wymaga małego wyjaśnienia:

  • (\d+) – pierwsza grupa dopasowania zbudowana tak samo jak poprzednio
  • / – czyli jawnie podany znak jaki musi występować po pierwszej odkrytej liczbie
  • (\d+) – druga grupa dopasowania
  • Zauważ, że nie dopuszczamy występowania w napisie jakichkolwiek innych znaków poza liczbą, ukośnikiem i liczbą
a_text = '1234/5678'
re_expression = re.compile('(\d+)/(\d+)')
re_result = re.match(re_expression,a_text)
re_result.groups()

I ostatni przykład. Tu mamy tekst ‚The price for 10 pieces is 330 USD’ i chcemy z niego wydobyć cenę 330. Logika postępowania taka sama jak poprzednio, a wyrażenie regularne:

  • .* – dowolna ilość dowolnych znaków
  •  – spacja
  • (\d+) – grupa dopasowania
  •  USD$ – spacja, napis USD i na tym koniec tekstu. Nic więcej tam nie może występować – to właśnie znaczenie znaku $
a_text = 'The price for 10 pieces is 330 USD'
re_expression = re.compile('.* (\d+) USD$')
re_result = re.match(re_expression,a_text)
re_result.groups()

 

Dodaj komentarz:

Autor: Rafał Kraik