Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek  (Přečteno 3384 krát)

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
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
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

Kedrigern

Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #1 kdy: 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!" )
« Poslední změna: 02 Června 2012, 17:08:45 od Kedrigern »

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #2 kdy: 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.
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

Kedrigern

Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #3 kdy: 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 :)

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #4 kdy: 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')

karlitos

  • Stálý člen
  • **
  • Příspěvků: 1057
  • Bioinformatics - solutions in-silico
    • homepage
Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #5 kdy: 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
Lenovo ThinkCentre A61 912073G
Athlon X2 5000+ 4GB RAM Nvidia Geforce 9500GT
Linux Mint 9 Isadora , Win7 64Bit

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #6 kdy: 02 Června 2012, 18:43:02 »
Tady tedy lépe:

Kód: [Vybrat]
re.search( r'\[(\d*)\]', '[1995] bezne vykazy').group(1)
« Poslední změna: 02 Června 2012, 18:51:41 od GdH »

starenka

  • Stálý člen
  • **
  • Příspěvků: 1276
  • Karma: plynová [zapalovač] [hasičák]
    • /home/starenka
Re:regularni vyrazy (v pythonu) - cislice uvnitr hranatych zavorek
« Odpověď #7 kdy: 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
« Poslední změna: 16 Července 2012, 00:40:05 od starenka »
mojenka | blozinek v2 | starej blozinek | krotim hady za penize | UJ! Kalužátor

Debian testing vrní v Thinkpadu X200/bedně/EEE 900a, MasoX Tiger v lampe

 

Provoz zaštiťuje spolek OpenAlt.