Regulární výrazy, práce s textem IBlil Úvod do programování skrze Python 2012 Práce s textem Příklady: • statistiky o studentech • frekvenční analýza textu • zpracování dotazníku, an • v tomto kurzu pro zjednodušení pracujeme jen s anglickou abecedou • resp. s texty bez hacku a carek • pro zájemce viz např. http://www.py.cz/PythonUnicodeCestina • základ: specifikovat kódování na začátku souboru # -*- coding: utf-8 -*- Regulární výrazy: použití • programování • textové editory • příkazová řádka: např. grep • teorie: formální jazyky, konečné automaty Regulární výrazy • obecně používaný nástroj • základní syntax stejná ve většině jazyků, prostředí a následuje: • základní syntax regulárních výrazů • použití v Pythonu • nerozebíráme všechny technické detaily (podrobněji viz dokumentace) import re f = open("testovaci-soubor.txt") for radek in f .readlinesO : if re.search(r'[a-z]+@[a-z]+\.cz', radek): print radek f closeO Znaky a speciální znaky • základní znak „vyhoví" právě sám sobě • např. „cz" v předchozím příkladě • speciální znaky: .~$* + ?{}[]\l() • umožňují konstrukci složitějších výrazů • chceme, aby odpovídaly příslušnému symbolu =4> prefix \ Výběr ze skupiny znaků [] • [abc] - jeden ze znaků a, b, c • [a-z] - výběr z intervalu (malé písmeno anglické abecedy) • ~ na začátku výběru = negace: • [~abc] cokoliv jiného než a, b, c Často používané skupiny znaků \d Čísla: [0-9] \D Cokoliv kromě čísel: [~0-9] \s Bílé znaky: [ \t\n\r\f \v] \S Cokoliv kromě bílých znaků: [~ \t\n\r\f\v] \w Alfanumerické znaky: [a-zA-Z0-9_] \W Nealfanumerické znaky: [~a-zA-Z0-9_] Speciální symboly libovolný znak začátek řetězce konec řetězce alternativa - výběr jedné ze dvou možností Příklady Jaký je význam následujících výrazů? • \d[A-Z]\d \d\d\d\d • ~a.*a$ • kocka|pes Opakování * nula a více opakování + jedno a více opakování ? nula nebo jeden výskyt {m,n} m až n opakování Příklady Která z následujících slov vyhoví jednotlivým výrazům? p[ars]e p[ars]*e p[~ars]e ps pes pse poe prase poklice Příklady Která z následujících slov vyhoví jednotlivým výrazům? p[ars]e p[ars]*e p[~ars]e ps X X X pes X / X pse / / X poe X X / prase X / X poklice X X X Kontrola tabulky v Pythonu texty = ["ps","pes","pse","poe","prase","poklice"] výrazy = [ r'p[ars]e', r'p[ars]*e', r'p[~ars]e' ] for text in texty: print text, for vyraz in výrazy: if re.search(vyraz, text): print 1, else: print 0, print Příklady Jaký je význam následujících výrazů? • \d{3}\s?\d{3}\s?\d{3} • [a-z]+@[a-z]+\.cz a ~To:\s*(fi Ikit)(-int)?@fi.muni.cz Regulární výrazy v Pythonu • knihovna re • re.match - hledá shodu na začátku řetězce • re. search - hledá shodu kdekoliv v řetězci • (re. compile - pro větší efektivitu) • „raw string" - r'vyraz' - nedochází k interpretaci speciálních znaků jako u běžných řetězců v Pythonu ulární výrazy v Pythonu: práce s výsledkem • match/search vrací „MatchObject" pomocí kterého můžeme s výsledkem pracovat • pomocí kulatých závorek () označíme, co nás zajímá • Alice\s+(\w+) Regulární výrazy v Pythonu: práce s výsledkem »> m = re.match(r"(\w+) (\w+)", \ "Isaac Newton, fyzik") »> m.group(0) 'Isaac Newton' »> m.group(1) 'Isaac' »> m.group(2) 'Newton' • nahrazení řetězce jiným výrazem • nejen statické řetězce, ale i regulární výrazy • re.sub Rozdělení řetězce • split - rozdělí řetězec podle zadaného podřetězce, vrací seznam částí • join - spojení seznamu řetězců do jednoho »> řetězec = "Holka modrooká nesedavej u potoka" »> řetězec. split () ['Holka', 'modrooká', 'nesedavej', 'u', 'potoka'] »> řetězec. split ('o') ['H', 'lkam', 'dr', ", 'ka nesedavej up', 'ť, 'k >» řetězec. split ('ka') ['Hol', ' modroo', ' nesedavej u poto', ''] Řetězce: další funkce • find, count - vyhledávání a počítání podřetězců • lower, upper - převod na malá/velká písmena • ljust, rjust, center - zarovnání textu • lstrip, rstrip - ořezání bílých znaků na začátku/konci Práce se soubory Otevírání a zavírání: • f = open("mujsoubor.txt") - otevření pro čtení • f = open("muj soubor .txt", "w") - otevření pro zápis • f.closeO - uzavření souboru • zápis pomocí with - lepší praxe (ale pokročilejší, souvisí s výjimkami) Čtení a zápis: • f .readlineO - vrátí další řádek ze souboru • f . readlines () - vrátí seznam všech zbývajících řádků • f .write (řetězec) - zapíše do souboru Příklad: Zpracování HTML • vstup: HTML soubor • cíl: vybrat odkazy a nadpisy • ukážeme naivní řešení se soubory, reg. výrazy • systémovější řešení: využití knihoven pro práci s URL zdroji, parsování HTML Zpracování HTML