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.search()¶
import re
date = "I was born on 05.12.1995."
pattern = r'(\d{1,2})\.(\d{1,2})\.(\d{1,4})'
match = re.search(pattern, date)
if match:
print("Full date: " + match.group(0)) # või match.group()
print("Day: " + match.group(1))
print("Month: " + match.group(2))
print("Year: " + match.group(3))
Väike spikker:
# d nagu ‘digit’ tähendab numbrit (0-9).
# . tähendab täpselt punktimärki. Lihtsalt punkt (.) tähistaks ükskõik millist märki (v.a reavahetusmärk).
# d {1,4} tähendab, et otsitakse ühte kuni nelja numbrit.
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 nagure.finditer()
,match.group()
võimatch.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')