Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: karlitos 02 Června 2012, 13:01:23

Název: regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: karlitos 02 Června 2012, 13:01:23
Zdravim,

potrebuju si hromadne prejmenovat nejake slozky, tak jsem se zacal zabyvat regularnimi vyrazy. Protoze hodne delam vy pythonu tak sem zacal s tim, ted jsem projel nekolik ruznych navodu na internetu, ale zaseknul sem se u nasledujici veci :
Potrebuju z retezce [1995] bezne vykazy vytahnout rok. Jenze :
Kód: [Vybrat]
\[\d*\]mi vyhodi [1995]. No a ja bych moc rad dostal jen ten rok. Samozrejme si umim poradit tim ze na tohle dale pouziju \d ale zajimalo by me jak udelat regularni vyraz : "blok cislic kterym predchazi hranata zavorka a nasleduje je hranata zavorka" bez toho aby ty zavorky byly ve vysledku. Co jsem se dival tak ^ a $ jsou specialni znaky pro zacatek a konec retezce a ne slova.

Asi si nekde stojim na vedeni, tak kdyby mi nekdo mohl poradit, budu moc rad,

Diky K
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: Kedrigern 02 Června 2012, 16:59:46
Python neznám, ale viditelně jde o to jakou funkci použiješ. Typicky se funkce pro regexp budou vysvětlovat na funkcích, které provádějí pouze match (čili zjistí zda string odpovídá). Ty potřebuješ složitější funkci, která zjistí zda daný řádek odpovídá a pak vypíše, co potřebuješ.

Např. mě funguje toto:
Kód: [Vybrat]
#!/usr/bin/python
import re

# vstupni string
line = "[1995] Cats are smarter than dogs";

# Nahraď všechno, co není číslo za prázdný string, použije string line
matchObj = re.sub( r'\D', "", line);

if matchObj:
        print matchObj
else:
        print "No match!"

Mrkni třeba sem: http://www.tutorialspoint.com/python/python_reg_expressions.htm

PS: V Pythonu 2.7 ti to nebude chodit s komentáři s diakritikou.

V Pythonu 3 to bude vypadat takhle:
Kód: [Vybrat]
#!/usr/bin/python3.2
import re

# vstupni string
line = "[1995] Cats are smarter than dogs";

# Nahrad vsechno, co neni cislo za prazdny string, pouzije string line
s = re.sub( r'\D', r'', line);

if s:
        print ( s )
else:
        print ( "No match!" )
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: karlitos 02 Června 2012, 17:50:14
Diky za odpoved. Problem toho reseni je pokud mam treba retezec jako : [1234] vykazy za platby 33a proto hledam cislice v tech zavorkach ale tak, aby mi to dalo vysledek bez zavorek. Lepereceno hledam to jak udelat : najdi neco co nasleduje po X a predchazi Y a ne neco co zacina X a konci Y. Samozrejme si to umim poresit ale ne tak elegantne jak bych chtel.
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: Kedrigern 02 Června 2012, 18:04:13
No jasně. Říkám, že potřebuješ najít správnou funkci nebo posloupnost funkcí. Např. toto funguje:
Kód: [Vybrat]
#!/usr/bin/python3.2
import re

# vstupni string
line = "[1995] Cats are smarter than dogs [1995] 19";

# Nahrad vsechno, co neni cislo za prazdny string, pouzije string line
s = re.sub( r'\D', r'', line);
s2 = re.split('(\d+)',line);

if s:
        print ( s )
else:
        print ( "No match!" )

if s2:
        print (s2)
        print (s2[1])

Splitnuto dle čísel a vypíšu první (pokud tím řádky začínají). Samozřejmě toto řešení:
1) Nemusí být vhodné pro tvou úlohu (to by chtělo vědět, co přesněji chceš a jaká data lze očekávat)
2) V Pythonu se nevzynám :)
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: GdH 02 Června 2012, 18:06:15
Regulární výraz, který požaduješ neexistuje, už z podstaty. Pokud do výrazu zahrneš kontext, bude tam i ten. Ale je možné ve většině rozumných nástrojů definovat subřetězce:

Kód: [Vybrat]
import re
re.sub( r'.*\[(\d*)\].*', r'\1', '[1995] bezne vykazy')
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: karlitos 02 Června 2012, 18:41:16
Regulární výraz, který požaduješ neexistuje, už z podstaty. Pokud do výrazu zahrneš kontext, bude tam i ten.

AHA - diky, to jsem si neuvedomil. Kazdopadne diky vsem za rady, uz si s tim nejak poradim. K
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: GdH 02 Června 2012, 18:43:02
Tady tedy lépe:

Kód: [Vybrat]
re.search( r'\[(\d*)\]', '[1995] bezne vykazy').group(1)
Název: Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
Přispěvatel: starenka 16 Července 2012, 00:37:59
PS: V Pythonu 2.7 ti to nebude chodit s komentáři s diakritikou.
ale bude, jen je treba definovat kodovani

Kód: [Vybrat]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print 'fap'*100 #řřřřřřřřřřěřěřěřěřěř+éíšá+čé+ěíšáčéě+íášč--

ps. na zkouseni regularu je zenialni regetron http://pypi.python.org/pypi/regetron