Vastuste grupeerimine

re.search() ja re.finditer():

Ümarsulgudega grupeerides jääb vaba valik, mitmendat gruppi tagastada. Grupeerimiseks on kaks võimalust:

re.search: Leiab esimese otsinguvaste sõnest.

re.finditer: Leiab kõik otsinguvasted sõnest.

Järgnevates näidetes kasutame mõlemaid funktsioone, et leida tekstist kuupäevi.

re.finditer()

import re

date = "I was born on 12.05.2004 and my mama on 20.04.1967"
pattern = r'(\d{1,2})\.(\d{1,2})\.(\d{1,4})'
matches = re.finditer(pattern, date)
for match in matches:
    print("Full date:", match.group(0))  # Full date: 12.05.2004, Full date: 20.4.1967
    print("Day:", match.group(1))  # Day: 12, Day: 20
    print("Month:", match.group(2))  # Month: 05 Month: 04
    print("Year:", match.group(3))  # Year: 2004, Year: 1967

re.findall()

re.findall on nagu re.finditer(), kuid kahe erinevusega.

re.finditer() tagastab ennikuid, re.findall() aga paneb kõik leiud järjendisse.

re.finditer() võimaldab grupeerimist, re.findall() aga toimib nagu re.finditer(), match.group() või match.group(0).

Järgnevas näites otsime tekstist üles meiliaadresse ning kasutame re.findall(), et need kokku koguda:

import re

text = "Mu email on f-b@bar.com, sõbra email guido@baggins.com, ema email -a@bag.com. ja isa oma -@bag.com."
pattern = r'[\w\-]+@\w+\.\w+'
emails = re.findall(pattern, text)

for email in emails:
    print(email)  # ['f-b@bar.com', 'guido@baggins.com', '-a@bag.com', '-@bag.com']

Väike spikker:

# [\w\-]+ - ‚+‘ märk sulgude lõpus tähendab, et tagastatakse üks või enam korda.

# @ otsib täpselt „@“ märki.

# . otsib täpselt punkti. Kui panna kurakaldkriipsuta ‘.’, otsitakse kõike peale reavahetuse märgi.

# w+ otsib vähemalt ühte tähte, numbrit või alakriipsu. ‘w’ pannes, otsitakse vaid tähte ‘w’, ’\w’ otsib ühte tähte, numbrit või alakriipsu. ’\w’ otsib üles kõik tähed kuni järgmise muu sõnamärgini (number, tühik jne.)

Sama saab ka teha ka olukorras, kus kogume vastused gruppidesse:

import re

pattern = r"([abc])(\d+)"
text = "a123 b456 c789"

matches = re.findall(pattern, text)

print(matches)       # [('a', '123'), ('b', '456'), ('c', '789')]
print(matches[0])    # ('a', '123')
print(matches[1])    # ('b', '456')
print(matches[2])    # ('c', '789')