[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