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()