re.
\,
aby można było ich używać jako literałów. Wspomniane znaki specjalne to: \ . ^ $ ? + * { } [ ] |
Dla częstych klas znaków dostępne są poniższe skróty.
| Klasa znaków | Dopasowanie |
|---|---|
| . | Dowolny znak z wyjątkiem znaku nowej linii |
| \d | Dowolna cyfra |
| \D | Dowolna znak nie będący cyfrą |
| \s | Dowolny biały znak |
| \S | Dowolny znak nie będący białym znakiem |
| \w | Dowolny znak alfanumeryczny (litera lub cyfra) |
| \W | Dowolny znak nie będący znakiem alfanumerycznym |
Kwantyfikatory określają ilość powtórzeń znaków lub sekwencji we wzorcach. Domyślnie kwantyfikatory są zachłanne, tzn. starają się dopasować maksymalną możliwą ilość znaków w tekście.
| Kwantyfikator | Dopasowanie |
|---|---|
| * | 0 lub więcej wystąpień |
| + | 1 lub więcej wystąpień |
| ? | 0 lub 1 wystąpienie |
| {m} | dokładnie m wystąpień |
| {m,} | co najmniej m wystąpień |
| {,n} | co najwyżej n wystąpień |
| {m,n} | od m do n wystąpień |
| [...] | jeden znak spośród zbioru znaków |
| [^...] | jeden znak spoza zbioru znaków |
| A | B | dopasowanie A lub B, operator alternatywy jest zachłanny |
Dodanie znaku zapytania po kwantyfikatorze przekształca go w kwantyfikator niezachłanny (leniwy). Kwantyfikator niezachłanny stara się dopasować minimalną możliwą ilość tekstu.
| Kwantyfikator | Dopasowanie |
|---|---|
| *? | 0 lub więcej wystąpień, wersja niezachłanna |
| +? | 1 lub więcej wystąpień, wersja niezachłanna |
| ?? | 0 lub 1 wystąpienie, wersja niezachłanna |
| {m,n}? | od m do n wystąpień, wersja niezachłanna |
Asercje (kotwice) pozwalają wyznaczyć miejsce w tekście, w którym musi pojawić się dopasowanie. Asercje mają w dopasowaniu zerową długość.
| Asercja | Dopasowanie |
|---|---|
| ^ | początek tekstu, także początek nowej linii w przypadku włączonej opcji re.MULTILINE |
| $ | koniec tekstu, także koniec nowej linii w przypadku włączonej opcji re.MULTILINE |
| \A | początek tekstu |
| \Z | koniec tekstu |
| \b | pusty string na początku lub końcu słowa (dopasowuje granicę słowa albo początek lub koniec tekstu) |
| \B | pusty string, lecz nie na początku lub końcu słowa (dopasowanie wewnątrz słowa) |
| (?=e) | dopasowuje łańcuch, jeśli bezpośrednio po nim następuje wyrażenie pasujące do e (ang. positive lookeahead) |
| (?!e) | dopasowuje łańcuch, jeśli bezpośrednio po nim nie następuje wyrażenie pasujące do e (ang. negative lookeahead) |
| (?<=e) | dopasowuje łańcuch, jeśli bezpośrednio przed nim następuje wyrażenie pasujące do e (ang. positive lookebehind) |
| (?<!e) | dopasowuje łańcuch, jeśli bezpośrednio przed nim nie następuje wyrażenie pasujące do e (ang. negative lookebehind) |
W przypadku asercji wstecznych (ang. lookbehind)
implementacja dla Pythona
dopuszcza skończoną i ustaloną długość wzorca e.
Zatem użycie
operatora Kleen'a * lub operatora zakresu {n,m} jest niedozwolone w asercji wstecznej.
r, która wyłącza specjalne znaczenie ukośnika.
Dobrą praktyką jest zawsze definiowanie wzorców jako surowych łańcuchów.
Przykłady zwykłych łańcuchów i równoważnych im surowych łańcuchów:
| Zwykły łańcuch | Łańcuch surowy |
|---|---|
"ab*" | r"ab*" |
"\\ten" | r"\ten" |
"\\w+\\s+" | r"\w+\s+" |
Nawiasy oprócz zwykłej funkcji, wpływania na kolejność obliczeń, pełnią drugą ważną rolę - tworzą z wyrażenia w nawiasach tzw. grupę.
| Wyrażenie | Znaczenie |
|---|---|
| (...) | dopasowanie wyrażenia w nawiasie jako grupy, po dopasowaniu pierwszej grupy można odwoływać się we wzorcu do jej zawartości poprzez odwołanie wsteczne \1 i odpowiednio poprzez \2,\3... do zawartości kolejnych dopasowanych grup |
| (?:...) | nawiasy nieprzechwytujące, od zwykłych nawiasów różnią się tym, że po dopasowaniu nie można odwoływać się do zawartości dopasowanego wyrażenia poprzez odwołania wsteczne |
| (?P<name>...) | tworzy grupę nazwaną name |
| (?P=name) | dopasowuje tekst, który został dopasowany wcześniej przez grupę nazwaną name |
| (?(1)then|else) | wyrażenie warunkowe, jeśli pierwsza grupa przechwytująca dopasowała porcję tekstu, dopasuj wyrażenie
then. Jeśli grupa przechwytująca nr 1 nie brała udziału w dopasowaniu tekstu, dopasuj wyrażenie else |
\numer.
sub.
sub:
\1, \2, ....
\g<0> oraz \g<name>, gdzie name to nazwa grupy nazwanej.
\g<1>,\g<2>,.... Jest to przydatne np. do rozróżnienia pomiędzy
zawartością grupy dwudziestej \20 a zawartością grupy drugiej, po której następuje literał 0: \g<2>0
Przykłady zastosowania grupowania do wyszukiwania i zastępowania wzorców:
pattern = r'\w+ \w+'
r = re.compile(pattern)
m = r.match('Hello world, ...') # dopasowuje pare slow rozdzielonych spacja
Dopasowanie pary identycznych słów:
pattern = r'(\w+) \1'
r = re.compile(pattern)
m = r.match('Hello world, ...') # brak dopasowania
m = r.match('Hello Hello, ...') # dopasowanie
Dopasowanie pary identycznych słów przy pomocy grupy nazwanej:
pattern = r'(?P<word>\w+) (?P=word)' # to samo co r'(\w+) \1' przy pomocy grupy nazwanej
r = re.compile(pattern)
m = r.match('Hello Hello, ...')
Zamiana adresu www na hyperlink:
str = r'http://www.python.org' pattern = r'(http://\w+(\.\w+)+)' r = re.compile(pattern) link = r.sub(r'<a href="\1">\1</a>', str)Zamiana adresu www na hyperlink z użyciem grup nazwanych:
str = r'http://www.python.org' pattern = r'(?P<addr>http://\w+(\.\w+)+)' r = re.compile(pattern) link = r.sub(r'<a href="\g<addr>">\g<addr></a>', str)
Opcje i modyfikatory wpływają na sposób dopasowywania wzorca w tekście.
| Opcja (długa) | Opcja (krótka) | Znaczenie |
|---|---|---|
| re.IGNORECASE | re.I | Wielkość liter nie jest brana pod uwagę przy dopasowywaniu |
| re.DOTALL | re.S | Znak . pasuje również do znaku nowej linii |
| re.MULTILINE | re.M | ^ pasuje nie tylko do początku łańcucha, ale także do początku każdej nowej linii w przypadku łańcucha składającego się z wielu linii. W analogiczny sposób modyfikowane jest dopasowanie $ |
| re.VERBOSE | re.X | Możliwość umieszczania komentarzy w wyrażeniu regularnym, spacje nie są częścią wzorca |
Opcje można przekazywać do szeregu funkcji, w tym funkcji re.compile.
Chcąc przekazać do funkcji wiele opcji należy użyć alternatywy bitowej:
r = re.compile("This is regex pattern", re.VERBOSE | re.IGNORECASE | re.DOTALL | re.MULTILINE)
W odróżnieniu od opcji, modyfikatory są częścią samego wzorca.
| Modyfikator | Znaczenie |
|---|---|
| (?i) | odpowiednik re.I |
| (?s) | odpowiednik re.S |
| (?m) | odpowiednik re.M |
| (?x) | odpowiednik re.X |
(?i) oraz (?m) można zapisać łącznie
jako (?im).
(?-i).
a = re.compile(r"\d+\.\d*")
b = re.compile(r"""\d+ # czesc calkowita
\. # kropka dziesietna
\d* # czesc ulamkowa""", re.X)
c = re.compile(r"""(?x) # wlacz komentarze
\d+ # czesc calkowita
\. # kropka dziesietna
\d* # czesc ulamkowa""")
Dodatkowo istnieje jeszcze możliwość wstawiania we wzorcu komentarzy w postaci (?#komentarz).
rere.
Moduł ten pozwala na dopasowywanie oraz zastępownie fragmentów tekstów przy pomocy opisanej powyżej składni.
Poniższy przykład znajduje w łańcuchu liczbę zmiennoprzecinkową przy pomocy prostej wersji wyrażenia regularnego dla liczb zmiennoprzecinkowych.
import re
pattern = r'(\d+).(\d*)'
str = '342.79+12.56'
m = re.match(pattern,str)
if m:
print("{0} pasuje do {1}".format(pattern, str) )
else:
print("{0} nie pasuje do {1}".format(pattern, str) )
simple.py
W przypadku, gdy będziemy wyszukiwali dany wzorzec wiele razy, efektywniej jest na początku dokonać kompilacji wzorca do obiektu.
Obiekty wyrażeń regularnych tworzone są metodą re.compile
Poprzedni przykład, tym razem z kompilacją wzorca będzie wyglądał następująco:
import re
pattern = r'(\d+).(\d*)'
str = '342.79+12.56'
r = re.compile(pattern)
m = r.match(str)
if m:
print("{0} pasuje do {1}".format(pattern, str) )
else:
print("{0} nie pasuje do {1}".format(pattern, str) )
Poprzedni przykład z kompilacją wzorca:
simple_compile.py
Analogicznie do metody match w powyższych przykładach,
większość metod modułu re istnieje w dwóch wariantach: z kompilacją wzorca i bez kompilacji wzorca.
group.
Dla grupy 0 funkcja zwraca całe dopasowane wyrażenie regularne.
Dla grup 1,2,... funkcja zwraca dopasowania w kolejnych nawiasach (nawiasy nieprzechwytujące nie są brane pod uwagę).
import re pattern = r'(\d+).(\d*)' str = '342.79+12.56' r = re.compile(pattern) m = r.match(str) print( m.group(0) ) # 342.79, cale dopasowanie print( m.group(1) ) # 342, dopasowanie (\d+) print( m.group(2) ) # 79, dopasowanie (\d*) print( m.start(1), m.end(1) ) # 0, 3 print( m.start(2), m.end(2) ) # 4, 6match.py
rere przedstawia poniższa tabela.
findall funkcje search oraz match znajdują tylko jedno dopasowanie.
sub, zwraca parę (zmodyfikowany łańcuch, liczba zamian)re