Představíme si základy práce s regulárními výrazy, speciální posloupnosti a metaznaky.
Regulární výrazy. Pomocí nich můžeme v Pythonu provádět analýzu textu nebo z něj získávat data. Co si ale pod tímto pojmem představit? Regulární výraz je způsob, jakým se na základě vzoru rozpoznávají nebo získávají data. Regulární řetězec může obsahovat metaznaky a speciální posloupnosti
Neupravené řetězce
Vždy, když budeme pracovat s regulárními výrazy, budeme používat tzv. neupravené řetězce. Standardně Python upravuje některé znaky v řetězci. Vyzkoušejte si:
>>> print "\tady"
ady
Takovýto výstup dostame, protože Python upraví \t
jako tabulátor. Tato záměna by se dala vyřešit napsáním dvou lomítek:
>>> print "\\tady"
\tady
Ale takovéto řešení je matoucí, proto Python nabízí neupravené řetezce. Tyto řetězce se uvozují znakem r
před první uvozovkou:
>>> retezec=r"\Neupravený řetězec\\\\"
>>> print retezec
\Neupravený řetězec\\\\
Proto pokud pracujete s regulárními výrazy, používejte vždy neupravené řetězce.
re.search
Jak už název funkce napovídá, budeme pomocí ní vyhledávat v textu. Tato funkce přijímá standardně dva parametry: hledaný výraz
a text
:
>>> re.search("Programujte","Programujte je informační portál")
<_sre.SRE_Match object at 0x00BF7758>
Jak vidíte, tato funkce nevrací rovnou index, kde se hledaný výraz nachází, ale objekt re. Pokud bychom chtěli zjistit, kde se hledaný výraz nachází, musíme použít funkci start
:
>>> index=re.search("Programujte","Programujte je informační portál")
>>> index.start()
0
Toto vše byste ale zvládli i bez regulárních výrazů. Než si budeme moci vysvětlit více, musíme si ukázat tabulku speciálních posloupností:
Sekvence | Význam |
\t | tabulátor |
\n | nový řádek |
\b | začátek nebo konec slova |
\B | místo, které není na začátku ani na konci slova |
\d | číslice |
\D | libovolný znak, který není číslicí |
\w | libovolné písmeno, číslice včetně podtržítka |
\W | libovolný znak, který není písmeno, číslice včetně podtržítka |
\\ | zpětné lomítko |
\s | neviditelný znak (tabulátor, nový řádek…) |
\S | znak, který není neviditelný znak |
Tyto speciální posloupnosti můžete použít v regulárním výrazu, tedy zastoupit pomocí nich větší počet znaků. Nyní již bychom mohli zvládnout najít první číslici v textu:
>>> re.search(r"\d","Číslice je na indexu 21").start()
21
re.findall
Další zajímavou funkcí je re.findall
. Ta vrátí seznam (list) všech nalezených možností. Aby nám fungovala čeština, musíme připojit re.U
.
>>> re.findall("a","Najdi všechna 'a'",re.U)
['a', 'a', 'a']
>>> re.findall("\d","Najdi všechna čísla: 123 456",re.U)
['1', '2', '3', '4', '5', '6']
K čemu nám ale je najít všechna čísla v textu, když se nakonec rozdělí na samostatná čísla, místo aby reprezentovala nějakou skupinu? K dosažení správného efektu slouží metaznaky. Těchto metaznaků je větší množství, ale my si jich ukážeme zatím jenom několik. Jako první metaznak bych uvedl +
. Tento znak říká, že se může předchozí regulární výraz jednou či vícekrát opakovat. Více snad pochopíte z ukázky:
>>> #Najdi skupiny čísel
>>> re.findall("\d+","123 456 789",re.U)
['123', '456', '789']
Nyní bychom mohli zkusit najít všechna slova začínající na a,A
:
>>> re.findall("\Wa\w+","Slovo auto autobus Admin",re.U)
[' auto', ' autobus']
- \W – Tento metaznak reprezentuje znak, který není číslo, písmeno nebo znak podtržení. V našem případě ho používáme proto, že před slovem musí být mezera nebo nějaká interpunkce. Pokud bychom tento metaznak vynechali, hledal by program každé
a
. - a – Reprezentuje písmeno.
- \w+ – Za písmenem
a
musí následovat nenulový počet písmen nebo číslic.
Jak vidíte, jako výsledek jsme dostali pouze slova, ktará začínala na a
. My jsme ale chtěli najít i slova začínající na A
. Mohli bychom nechat text dvakrát prohledávat pro každou variantu, ale lepší bude použít metaznak [ ]
. Tento metaznak reprezentuje výčet prvků:
[aA] – pokud je znak "a,A"
Nyní již zvládneme upravit regulární výraz tak, aby správně našel slova začínající na a,A
:
>>> re.findall("\W[aA]\w+","Slovo auto autobus Admin",re.U)
[' auto', ' autobus', ' Admin']
Tento regulární výraz se tváří, jako že je hotový, ale musíme ještě ošetřit jednu věc. Vyzkoušejte kód:
>>> re.findall("\W[aA]\w+","Auto")
[]
Nic nebylo nalezeno? Toto je způsobeno tím, že v regulárním výrazu uvádíme, že před písmenem a,A
bude \W
, tedy znak, který není písmeno, číslice ani podtržítko. Jenomže v našem případě není před písmenem a,A
žádný znak. Na tomto místě si proto představíme metaznak ?
. S jeho pomocí můžete určit, že regulární výraz, který se před metaznakem nachází, nemusí být splněn.
>>> re.findall("\W?[aA]\w+","Auto")
['Auto']
Tímto bych dnešní díl ukončil. V příštím díle si ukážeme, jak získávat pomocí regulárních výrazů údaje z textu.