[Tutor PyCZ] Regularni vyrazy

Petr Prikryl PrikrylP na skil.cz
Středa Září 21 15:00:22 CEST 2005


Sladecek Lukas
> 
> [...]v pythonu jsem novacek a momentalne resim 
> problem jak dosadit za text ktery najdu 
> (pomoci regularniho vyrazu) jakykoliv svuj vlastni text. 
> [...]
> opensh = os.popen(shell)
> for lineout in opensh.readlines():
> 	mode = re.match('\w+\s+Link\s+encap:(?P<MODE>\w+)\s+HWaddr', lineout)
> 	print mode.group('MODE')
> 
> [...]

Doprostřed souboru nemohu zapsat jinak dlouhý text,
než jaký tam byl. Přechroupat to mohu jen tak,
že čtu ze zdroje, upravuji načtené a nakonec zapisuji
do cílového souboru.

U regulárních výrazů v normálním řetězcovém literálu
se musí dávat pozor na to, aby se správně zdvojovala 
zpětná lomítka. Lepší je použít literál s r na začátku
(raw string), u kterého se při kompilaci neinterpretují
zpětná lomítka.

Pokud se regulární výraz používá v cyklu, je lepší ho
předem zkompilovat. Příklad:

=========================================================
import re

# Vygenerujeme vzorek dat.
f = file('vstup.txt', 'w')
for i in xrange(1000):
    f.write('         %i               \n' % i)
f.close()    

# Zkompilujeme si regularni vyraz pro pozdejsi efektivni
# praci s nim v cyklu.
rex = re.compile(r'^\s*(?P<xxx>\d*[0123]\d*)\s*$')

# Ze vstupniho souboru budeme prepisovat do vystupniho.
fin = file('vstup.txt')
fout = file('vystup.txt', 'w')
for line in fin:
    # Pokusime se o vyhledani vzorku.
    m = rex.search(line)
    
    # Pokud se podarilo, mame k dispozici cast radku -- obalime ji. 
    # V opacnem pripade opiseme puvodni radek
    if m:
        fout.write('opraveny radek ' + m.group('xxx') + ' konec radku.\n')
    else:
        fout.write(line)
        
fin.close()
fout.close()
=========================================================

pepr

-- 
Petr Prikryl (prikrylp at skil dot cz) 


Další informace o konferenci Tutor