[python] Problem s regularnym vyrazom

RMiklos na pss.sk RMiklos na pss.sk
Čtvrtek Únor 1 15:28:39 CET 2007


No ano, ale ak tam je iba jedno CREATE TABLE(...) tak to nemusi byt 
ukoncene so strednikom ;

Ja som zatial obisiel ten regularny vyraz tak, ze este ked vsetko 
nacitavam do stringu, preventivne hladam prvy strednik zlava a ak tam je, 
tak vsetko od neho napravo odstranim

    idx_1st_semicolon=sql_statement.find(';')
    if idx_1st_semicolon > 0:
      sql_statement=sql_statement[:idx_1st_semicolon]

No aj tak by ma zaujimal ten problem s regularnym vyrazom, pretoze som 
skusal aj non greedy ale to pracuje uplne zle.




Leos Pol <leos na radiante-corp.com> 
Sent by: python-bounces na py.cz
01.02.2007 15:15
Please respond to
Konference PyCZ <python na py.cz>


To
Konference PyCZ <python na py.cz>
cc

Subject
Re: [python] Problem s regularnym vyrazom






Zdravim,

ja bych to asi nelamal pres koleno a udelal bych tohle:

re.compile(r"^\s*CREATE\s+TABLE\s+"
           r"(?P<library>[A-Z0-9]+)\s*[/.]\s*(?P<file>[A-Z0-9]+)\s*"
           r"\((?P<tbl_field_def>[^;]*)\)")

tzn: Kazde sql query je ukonceno strednikem.....

Leo

RMiklos na pss.sk wrote:
> Rad by som tymto oslovil odbornikov na regularne vyrazy.
>
> Extrahujem datove polia tabulky cez regularny vyraz takto:
> --------------------------- skript ---------------------------
> import sys,re
>
> sql_statement='''CREATE TABLE IBPDDB071/R004660V
> (PERSONNR    DECIMAL     (10, 0)    NOT NULL WITH DEFAULT, LFDNR1 
DECIMAL 
>   (3, 0)     NOT NULL WITH DEFAULT, VOTYP       CHARACTER   (1) NOT 
> NULL WITH DEFAULT, BSSTAMMNR   DECIMAL     (7, 0)     NOT NULL WITH 
> DEFAULT,BSVNR       DECIMAL     (2, 0)     NOT NULL WITH DEFAULT );'''
> regexp_sql_create=\
> re.compile(r"^\s*CREATE\s+TABLE\s+"
>            r"(?P<library>[A-Z0-9]+)\s*[/.]\s*(?P<file>[A-Z0-9]+)\s*"
>            r"\((?P<tbl_field_def>.*)\)\s*")
>
> result=regexp_sql_create.search(sql_statement)
> if result == None:
>   # CREATE TABLE statement not valid ! 
>   print "SQL CREATE TABLE statement is not valid !!!"
>   sys.exit()
> else:
>   # Parse data from RegExp
>   library=result.group('library')
>   print "Library=%s" % library
>   table=result.group('file')
>   print "Table=%s" %table
>   table_field_def=result.group('tbl_field_def')
>   print "Field Definitions=%s" % table_field_def
> ------------------------ konec skriptu ------------------------
>
> Potom definicie dat. poli dalej pracovavam. 
> Toto by fungovalo, az na to ze SQL-skript je vygenerovany a okrem CREATE 

> TABLE (...); moze obsahovat aj LABEL ON (...);
> takze moze vyzerat takto:
>
> sql_statement='''CREATE TABLE IBPDDB071/R004660V
> (PERSONNR    DECIMAL     (10, 0)    NOT NULL WITH DEFAULT, LFDNR1 
DECIMAL 
>   (3, 0)     NOT NULL WITH DEFAULT, VOTYP       CHARACTER   (1) NOT 
> NULL WITH DEFAULT, BSSTAMMNR   DECIMAL     (7, 0)     NOT NULL WITH 
> DEFAULT,BSVNR       DECIMAL     (2, 0)     NOT NULL WITH DEFAULT ); 
Label 
> on IBPDDB071/R004660V(PERSONNR   IS 'PERSONNR', LFDNR1     IS 'LFDNR1', 
> VOTYP      IS 'VOTYP', BSSTAMMNR  IS 'BSSTAMMNR', BSVNR      IS 
> 'BSVNR');'''
>
> Vtedy mi horeuvedeny regexp matchuje (pretoze je greedy) vsetko, takze 
> rozpozna vsetko od 'CREATE TABLE(' az po poslednu zatvorku ')' stringu 
> t.j. '..); LABEL ON(..' ale ja potrebujem aby rozpoznal len to co je v 
> tele CREATE TABLE. 
>
> Vie mi niekto poradit ako napisat ten regularny vyraz aby robil co 
> potrebujem?
> Mgr. Ing. Roman MIKLÓ© 
> Prvá stavebná sporiteµňa a.s. 
> Bajkalská 30, P. O. Box 48 
> 829 48  Bratislava 25 
> Tel.: +421/ 2 / 582 31 174 
> Fax: +421/ 2 / 582 31 109 
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
> 


-- 
----
Leos Pol
SW Engineer
Radiante Corp.

If it can be imagined,
we can implement it

_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python


Mgr. Ing. Roman MIKLÓ© 
Prvá stavebná sporiteµňa a.s. 
Bajkalská 30, P. O. Box 48 
829 48  Bratislava 25 
Tel.: +421/ 2 / 582 31 174 
Fax: +421/ 2 / 582 31 109 



Daląí informace o konferenci Python