Ukázka práce s regexy
import re
txt1 = "Hello world!"
re.match(r"He..o", txt1) # match hledá od začátku řetězce
# <re.Match object; span=(0, 5), match='Hello'>
re.match(r"He\w\wo", txt1) # \w je císlo 0-9 nebo písmeno a-Z a _ (podtržítko)
# <re.Match object; span=(0, 5), match='Hello'>
re.match(r"wo..d", txt1) is None # . je libovolný znak, pro tečku používáme \.
# True
re.search(r"wo..d", txt1) # search hledá kdekoliv v řetězci
# <re.Match object; span=(6, 11), match='world'>
re.search(r"^He..o", txt1) # ^ začátek řetězce
# <re.Match object; span=(0, 5), match='Hello'>
re.search(r"^wo..d", txt1) is None
# True
re.search(r"wo..d!$", txt1) # $ konec řerězce
# <re.Match object; span=(6, 12), match='world!'>
re.search(r"He.*o", txt1) # * libovolný počet výskytů
# <re.Match object; span=(0, 8), match='Hello wo'>
re.search(r"world!( Hello!)?",txt1) # ? nula výskytů nebo jeden výskyt
# <re.Match object; span=(6, 12), match='world!'>
re.search(r"He.*?o", txt1) # .*? vypne greedy přístup pro *
# <re.Match object; span=(0, 5), match='Hello'>
txt2 = "Hello world! Halloween 2024!"
# findall najde všechny výskyty daného řetězce
re.findall(r"[aiueo]", txt2) #[] označuje množinu
# ['e', 'o', 'o', 'a', 'o', 'e', 'e']
re.findall(r"\d", txt2) # \d označuje jeden znak
# ['2', '0', '2', '4']
re.findall(r"[aiueo]{2}", txt2) #{} počet výskytů
# ['ee']
re.findall(r"H[aiueo]{1}ll", txt2)
# ['Hell', 'Hall']
re.findall(r"l[^aiueo].", txt2)
#['llo', 'ld!', 'llo']
text = "Contact us at info@example.com or support@example.org."
pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" #\b znaky, které bývají na začátku a konci slova
re.findall(pattern, text)
# ['info@example.com', 'support@example.org']
html = """<h3>Seznam přednášek</h3>
<ol>
<li>Úvod, abeceda, řetězece, jazyk, konečný deterministický automat</li>
<li>Vlastnosti regulárních jazyků a nedeterminismus</li>
<li>Determinizace a regulární výrazy</li>
<li>Další vlastnoti regulárních jazyků a pumping lemma</li>
<li>Minimalizace</li>
<li>Zápočtový test</li>
</ol>"""
content = re.search(r"<ol>\s*(.*?)\s*</ol>", html, re.DOTALL) # DOTALL způsobí, že . rozpoznává i \n
content
# <re.Match object; span=(26, 338), match='<ol>\n <li>Úvod, abeceda, řetězece, jazyk, kon>
# () v RE tvoří takzvanou capture group - daný podřetězec se uloží jako do proměnné
content.group(1)
# '<li>Úvod, abeceda, řetězece, jazyk, konečný deterministický automat</li>\n <li>Vlastnosti regulárních jazyků a nedeterminismus</li> ... <li>Zápočtový test</li>'
# sub nahradí všechny vyskyty výrazu jiným řetězcem
content_mod = re.sub(r"^<li>|</li>$", "", content.group(1))
content_mod
# 'Úvod, abeceda, řetězece, jazyk, konečný deterministický automat</li> ... <li>Zápočtový test'
# split dělí řetězec podle regulárního výrazu
re.split(r"</li>\s*<li>", content_mod)
# ['Úvod, abeceda, řetězece, jazyk, konečný deterministický automat',
# 'Vlastnosti regulárních jazyků a nedeterminismus',
# 'Determinizace a regulární výrazy',
# 'Další vlastnoti regulárních jazyků a pumping lemma',
# 'Minimalizace',
# 'Zápočtový test']
# alternativně lze stejný proces udělat takto pomocí capture grup
re.findall("<li>(.*?)</li>", html)
# ['Úvod, abeceda, řetězece, jazyk, konečný deterministický automat',
# 'Vlastnosti regulárních jazyků a nedeterminismus',
# 'Determinizace a regulární výrazy',
# 'Další vlastnoti regulárních jazyků a pumping lemma',
# 'Minimalizace',
# 'Zápočtový test']
html2 = """<h3>Seznam přednášek</h3>
<ol>
<li>Úvod, abeceda, řetězece, jazyk, konečný deterministický automat (<a href="<?php echo BASE_DIR; ?>/slides/fj01.pdf"><b>pdf</b></a>)</li>
<li>Vlastnosti regulárních jazyků a nedeterminismus (<a href="<?php echo BASE_DIR; ?>/slides/fj02.pdf"><b>pdf</b></a>)</li>
<li>Determinizace a regulární výrazy (<a href="<?php echo BASE_DIR; ?>/slides/fj03.pdf"><b>pdf</b></a>)</li>
<li>Další vlastnoti regulárních jazyků a pumping lemma (<a href="<?php echo BASE_DIR; ?>/slides/fj04.pdf"><b>pdf</b></a>)</li>
<li>Minimalizace (<a href="<?php echo BASE_DIR; ?>/slides/fj05.pdf"><b>pdf</b></a>)</li></li>
<li>Zápočtový test</li>
</ol>"""
re.findall(r"<a href=\"(.*?)\">", html2)
# ['<?php echo BASE_DIR; ?>/slides/fj01.pdf',
# '<?php echo BASE_DIR; ?>/slides/fj02.pdf',
# '<?php echo BASE_DIR; ?>/slides/fj03.pdf',
# '<?php echo BASE_DIR; ?>/slides/fj04.pdf',
# '<?php echo BASE_DIR; ?>/slides/fj05.pdf']
# capture grupy jsou přístupné i při nahrazování pomocí \g
re.sub(r"(<a href=\".*?)(fj.*?\.pdf)\">.*?</a>", "\g<1>\g<2>\">\g<2></a>", html2)
# '<h3>Seznam přednášek</h3>\n<ol>\n <li>Úvod, abeceda, řetězece, jazyk, konečný deterministický automat (<a href="<?php echo BASE_DIR; ?>/slides/fj01.pdf">fj01.pdf</a>)</li>\n <li>Vlastnosti regulárních jazyků a nedeterminismus (<a href="<?php echo BASE_DIR; ?>/slides/fj02.pdf">fj02.pdf</a>)</li> ...<li>Zápočtový test</li>\n</ol>'
# část výstupu z příkazu 'top' na mac os
top = """Processes: 631 total, 2 running, 629 sleeping, 3400 threads 00:50:23
Load Avg: 1.35, 1.60, 2.52 CPU usage: 8.87% user, 5.52% sys, 85.59% idle
SharedLibs: 610M resident, 93M data, 26M linkedit.
...
"""
top_re = re.match("^Processes: (\d+) total, (\d+) running, (\d+) sleeping, (\d+) threads", top)
top_re.group(1)
# '631'
# všechny grupy získáme pomocí .groups()
top_re.groups()
# ('631', '2', '629', '3400')