[python] Problem s regularnym vyrazom

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


To som skusal ale neni to tak jednoduche. 
Toto 
------------------------------------------------------------------------------
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 );  Label 
on IBPDDB071/R004660V(PERSONNR   IS 'PERSONNR', LFDNR1     IS 'LFDNR1', 
VOTYP      IS 'VOTYP', BSSTAMMNR  IS 'BSSTAMMNR', BSVNR      IS 
'BSVNR');'''
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
------------------------------------------------------------------------------
da vysledok

Field Definitions=PERSONNR    DECIMAL     (10, 0

co je zle - vsetko ostatne to urezalo -pretoze zatvorky ')' su aj v 
definiciach poli




"Petr Prikryl" <PrikrylP na skil.cz> 
Sent by: python-bounces na py.cz
01.02.2007 15:22
Please respond to
Konference PyCZ <python na py.cz>


To
"Konference PyCZ" <python na py.cz>
cc

Subject
Re: [python] Problem s regularnym vyrazom






Roman MIKLÓ©
> Extrahujem datove polia tabulky cez regularny vyraz takto:
> [...]
> 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*")
> [...]
> Toto by fungovalo, az na to ze SQL-skript je vygenerovany a 
> okrem CREATE TABLE (...); moze obsahovat aj LABEL ON (...);
> [...]
> 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?

Stačí upravit ten regulární výraz tak, aby nebyl greedy,
tj. aby zastavil před první zavírací závorkou. K tomu stačí
modifikovat sekvenci '.*' na posledním řádku na '.*?'.
Otazník za opakovcím symbolem zajistí neľravou interpretaci.

pepr
_______________________________________________
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