[python] Problem s regularnym vyrazom

RMiklos na pss.sk RMiklos na pss.sk
Čtvrtek Únor 1 14:54:52 CET 2007


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 



Daląí informace o konferenci Python