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