abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Navštivte Abc obchůdek se samolepkami a přívěsky!
Rozšířené hledání
×
dnes 06:11 | Komerce
Rozrůstající se softwarová společnost v Plzni zabývající se telematikou hledá schopné vývojáře a nadšence se zájmem o OS Linux. Uplatnění zde najdou především vývojáři C++ se znalostí OS Linuxu, dále programátoři v jazyku Java nebo vývojáři se zkušenostmi s Oracle DB a Oracle ADF. Více informací o společnosti. … více »
Reklama | Komentářů: 0
24.5. 22:45 | IT novinky
NASA, která společně s Rackspace stála u zrodu projektu OpenStack, se již nadále nebude podílet na dalším vývoji této "infrastructure-as-a-service" platformy. V NASA totiž došli k závěru, že vzhledem k podpoře OpenStacku ze strany společností jako Red Hat, AT&T a HP lze jejich práci považovat za dokončenou. Posléze se NASA plánuje stáhnout i z vývoje další platformy pro cloud computing jménem Nebula.
Migilenik | Komentářů: 0
24.5. 22:45 | Upozornění
Blíží se svátek IPv6 a s ním i konference IPv6 Day. Na návštěvníky této akce čeká nejen bohatý program, ale také jedna speciální nabídka – v průběhu setkání bude možné získat se slevou 66 procent třetí vydání knihy IPv6 vysokoškolského pedagoga a publicisty Pavla Satrapy, tedy za 105 korun. … více »
Vilem Sladek | Komentářů: 5
24.5. 16:14 | Pozvánky

Přijďte si zasprintovat na Djangu, jiném Python open-source projektu, nebo jen potkat ostatní vývojáře!

… více »
Whit | Komentářů: 0
24.5. 10:20 | Nová verze
Na zrcadlech a torrentech jsou již k dispozici ISO obrazy distribuce Mageia 2. Poznámky k vydání čtěte zde.
Liborek | Komentářů: 14
23.5. 13:47 | Pozvánky

Letos v říjnu se v Praze uskuteční hned několik konferencí. Odehraje se zde nově vzniklá konference LinuxDays. K ní se přidá čtvrtý ročník openSUSE Conference, dvanáctý ročník SUSE Labs conference a aby to nebylo málo, přidá se i první ročník Gentoo miniconf. A to vše ve stejné dny a na stejném místě.

… více »
Miška | Komentářů: 7
23.5. 13:27 | Zajímavý projekt
Printerd je název nového projektu tiskového démona, který bude využívat PolicyKit a D-Bus. Projekt je zatím na úplném začátku, takže nejde o nic vhodného k produkčnímu nasazení. Mimo jiné aktuálně akceptuje jako vstup jen PDF dokumenty.
Luboš Doležel (Doli) | Komentářů: 56
23.5. 13:25 | Zajímavý software
Tři vývojáři ze společnosti Engine Yard přecházejí po dohodě mezi firmami do Red Hatu. Jde o vývojáře zabývající se rozvojem projektu JRuby. To ukazuje, že Red Hat má zájem o podporu alternativních jazyků nad OpenJDK.
Luboš Doležel (Doli) | Komentářů: 1
23.5. 13:20 | Zajímavý software
Fedora přejde na knihovnu libusbx, což je fork původní knihovny libusb. Důvodem pro fork byl zjevný nedostatek času nebo zájmu ze strany správce projektu. libusbx už teď nabízí užitečné funkce navrch.
Luboš Doležel (Doli) | Komentářů: 4
23.5. 10:29 | Nová verze
Vyšlo LLVM 3.1. Vylepšení se dotýkají podpory C++ 11 nebo architektur ARM a MIPS. Dále se můžete těšit z Python bindings nebo nástroje AddressSanitizer pro detekci chyb při práci s pamětí.
Luboš Doležel (Doli) | Komentářů: 0
Pokud by se prohlížeč Opera stal svobodným:
 (9%)
 (32%)
 (1%)
 (58%)
Celkem 252 hlasů
 Komentářů: 31, poslední včera 22:38
    Rozcestník
    Reklama
    Autoškola testy online Levný benzín

    Standardní knihovna pro Python - 8 (regulární výrazy 1)

    10. 4. 2007 | Jakub Matys | Programování | 8843×

    Regulární výrazy představují moderní, výkonnou a komplexní metodu pro prohledávání řetězců. Není divu, že mnoho jazyků práci s regulárními výrazy podporuje. Ani Python není výjimkou...

    Regulární výraz (regular expression) je řetězec popisující celou množinu řetězců, neboli předpis pro podobné řetězce. Regulární výrazy programátorovi usnadní složitější prohledávání řetězců např. při kontrole vstupů nebo při parsování kódu (HTML, konfigurační soubory). Pokud chce uživatel v textu vyhledat nějaký řetězec, který nezná přesně, může zadat regulární výraz. Program pak nalezne všechny části textu, které danému výrazu odpovídají. Regulární výrazy v Pythonu pracují podobně jako zástupné znaky * a ? v shellu (místo * je možné vložit jakékoliv množství znaků, místo ? se vkládá jen jeden znak), mají však komplexnější využití.

    Ve verzi 1.5 byla do Pythonu přidána podpora regulárních výrazů ve stylu Perl. Ta je zajišťována modulem re. V předchozích verzích byly regulární výrazy dostupné také, ale jednalo se o výrazy v emacsovém stylu (modul regex). Vzor regulárních výrazů je vždy zkompilován do byte kódu, který je poté zpracován srovnávacím kódem napsaným v jazyce C.

    Vzhledem k tomu, že regulární výrazy často využívají speciální znaky a zpětné lomítko, je vhodné je zapisovat jako tzv. raw řetězce (r'\n' == '\\n').

    Základní syntaxe regulárních výrazů

    Vzory regulárních výrazů se skládají z obyčejných znaků, které mají normální význam (např. "jméno", "Petr" atp.), a tzv. metaznaků. Jedná se o znaky, které mají speciální význam:

    • . - tečka - vyhledá jakýkoliv znak kromě přechodu na nový řádek.
    • ^ - vyhledá začátek řetězce.
    • $ - vyhledá konec řetězce.
    • [...] - vyhledá jeden ze znaků definovaných uvnitř hranatých závorek, např. r"[abcABC]" nebo r"[a-zA-Z]". Speciální znaky nemají uprostřed množiny svůj standardní význam.
    • [^...] - v daném místě se má vyskytovat jeden libovolný znak, vyjma znaků definovaných mezi závorkami.
    • | - A|B vyhledá A nebo B, kde A a B jsou regulární výrazy.
    • kvantifikátory - určují, kolikrát se smí předchozí znak opakovat.
      • * - vyhledá nulové nebo více opakování předcházejícího výrazu, vybere co nejvíce opakování.
      • + - vyhledá jedno nebo více opakování předcházejícího výrazu, vybere co nejvíce opakování.
      • ? - vyhledá nulové nebo jedno opakování předcházejícího výrazu.
      • *? - vyhledá nulové nebo více opakování výrazu, ale vybere co nejméně opakování.
      • +? - vyhledá jedno nebo více opakování výrazu, ale vybere co nejméně opakování.
      • ?? - vyhledá nulové nebo jedno opakování, přičemž vybere co nejméně opakování.
      • {m, n} - vyhledá opakování předcházejícího výrazu od m do n-krát, vybere co nejvíce opakování.
      • {m, n}? - vyhledá opakování předcházejícího výrazu od m do n-krát, vybere co nejméně opakování.

    Potřebujete-li vyhledávat metaznak v jeho původním významu, můžete jej zpřístupnit přes zpětné lomítko (escapování).

    Dále pak regulární výrazy v Pythonu umožňují pracovat se skupinami a obsahují speciálně předdefinované skupiny znaků - obojí si ukážeme v příštím díle.

    Nutnou dávku teorie máme za sebou. Ukažme si nejdříve, jak se vlastně s regulárními výrazy pracuje:

    >>> import re
    >>> retezec1 = "abcde"
    >>> retezec2 = "123"
    >>> vzor = re.compile(r"a+")
    >>> vzor.match(retezec1)
    <_sre.SRE_Match object at 0xb7bdf4b8>
     # pri nalezeni shody se vraci objekt Match, se kterym lze dale pracovat
    >>> vzor.match(retezec2)
     # v pripade,ze nebyla nalezena shoda, vraci None
    >>> re.match(r"[1-9]+?", retezec2)
    <_sre.SRE_Match object at 0xb7bdf560>
    

    Jak je vidět, můžeme vzor nejdříve sami zkompilovat, což je vhodné při opakovaném porovnávání. V tomto případě voláme metody vráceného objektu. Funkce compile() může obsahovat ještě kombinaci parametrů, které se oddělují bitovým or ("|"):

    • I nebo IGNORECASE - nerozlišuje malá a velká písmena.
    • L nebo LOCALE - lokalizuje parametry \w, \W, \b a \B.
    • M nebo MULTILINE - ^ a $ se budou vztahovat na každý řádek řetězce, ne jen na jeho začátek a konec.
    • S nebo DOTALL - tečka (".") odpovídá všem znakům, včetně přechodu na nový řádek.
    • U nebo UNICODE - pro \w, \W, \b a \B nastaví Unicode rozšíření.
    • X nebo VERBOSE - ignoruje komentáře a neviditelné znaky.

    Můžeme také volat funkci modulu re, které předáme pouze nezkompilovaný "raw string". Funkci je pak možné předávat stejné parametry jako výše. Modul obsahuje více funkcí (objekt zkompilovaného vzoru pak více metod); pro začátek se však omezíme pouze na match(). Na ostatní se zaměříme v dalších dílech.

    Na závěr si předveďme několik příkladů, aby bylo jasně vidět, jak se zapisují vzory regulárních výrazů.

    re.match(r"a+", retezec) # vyhleda 1 a vice znaku a
    re.match(r"a*", retezec) # vyhleda 0 a vice znaku a
    re.match(r"o?kov", retezec) # vyhleda okov nebo kov
    re.match(r"tel(efon)?$", retezec)
     # vyhleda tel nebo telefon na konci retezce
    re.match(r"^[0-9]{2}$", retezec)
     # vyhleda dvouciferne desitkove cislo (00 az 99),
     #+ktere je jedinym obsahem retezce
    re.match(r"[0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+", retezec)
     # vyhledava hexadecimalni cisla
    re.match(r"(19|20)[0-9]{2}", retezec)
     # vyhleda letopocet mezi roky 1900 a 2099
    re.match(r"a\+b", retezec) # vyhleda 'a+b'
    
           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Jiří Popek avatar 10.4.2007 09:40 Jiří Popek | skóre: 24 | blog: programování | Košice
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    Pro skládání reg. výrazů a jejich odladění se mi velice osvědčil prográmek kodos.
    jardous@jabber.cz In a world without fences and walls, who needs Gates and Windows?
    10.4.2007 10:17 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    re.match(r"(19|20)[0-9]{2}", retezec)
     # vyhleda letopocet mezi roky 1900 a 2050
    
    hmm, možno tak v pythone :-)) Všade inde by bolo treba opraviť buď prvý riadok
    m/(?:19\d{2})|(?:20[0-4]\d)|2050/
    
    alebo druhý riadok
     # vyhleda letopocet mezi roky 1900 a 2099 (vrátane)
    
    10.4.2007 14:26 Jakub Matys
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    Omlouvam se - chybicka se vloudila. V komentari melo opravdu byt 1900 az 2099.
    10.4.2007 14:38 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    btw, aj tie hexa čísla sú nejaký zvláštny regexp. Autor mohol predviesť ignore-case match :-)
    m/^(?:0|(?!0)[0-9a-f]+)$/i
    
    mj41 avatar 10.4.2007 18:13 mj41 | skóre: 17 | blog: mj41 | Třinec a Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    Jak se da v Pythonu jednoduse udelat Perlovske:

    die "Zadany retezec neobsahuje letopocet od 1900 do 2099.\n" if $retezec !~ /(19|20)[0-9]{2}/;

    ?
    10.4.2007 20:26 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    třeba takhle
    #!/usr/bin/env python
    import re
    year_str = '1801d'
    if not re.match('(19|20)[0-9]{2}', year_str):
        raise SystemExit, 'Chyba formatu letopoctu'
    
    nebo takhle
    year_str = '1801d'
    try:
        rok = int(year_str)    
    except ValueError:
        raise SystemExit, '"%s" nelze prevest na cislo.' %year_str
    
    if rok < 1900 or rok > 2099:
        raise SystemExit, 'Rok %d je mimo interval 1900 a 2099.' %rok
    
    11.4.2007 13:37 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 8 (regulární výrazy 1)
    Afaik volání die prostě ukončí interpreter Perlu, takže v Pythonu by tomu odpovídalo exit. Výjimka se dá pomocí except zachytit a zpracovat ... <rejp>
    Při vyvolávání výjimky si typicky objekt reprezentující výjimku vytvářím -- doporučuje se zápis vyjadřující konstrukci nového objektu ;-)
    py.cz
    </rejp>
    Nežijeme v totalitě, bohužel!

    Založit nové vláknoNahoru

    ISSN 1214-1267   Powered by Hosting 90 Server hosting
    © 1999-2012 Argonit s. r. o. Všechna práva vyhrazena.