[python] Problem s regularnym vyrazom

Jan Janech devel na atlas.sk
Pátek Únor 2 13:38:26 CET 2007


RMiklos na pss.sk wrote:
> Predtym som cital ( 
> http://www.onlamp.com/pub/a/python/2006/01/26/pyparsing.html ) o module 
> pyparsing  ( http://pyparsing.wikispaces.com/), ale zial nemal som cas sa 
> s tym zaoberat. Doteraz parsujem vsetko iba regularnymi vyrazmi. Zda sa mi 
> to najrychlejsie riesenie - i ked nie najlepsie a ma to tiez svoje hranice 
> a uskalia.
> 
> Dik za info -o  yapps-e som doteraz nepocul. 
> Nevidim dokumetaciu Yappsu na tej stranke. preto sa chcem spytat: 
> 1. aky  je vstup pre Yapps? Nejako zapisana gramatika?
> 2. pouzil si Yapps1 alebo Yapps2
> 3. Nemas nejaky kratky priklad ako si parsoval to SQL?
> 
> s pozdravom
> 
> Roman

caw... kedysi som robil alter script generator pre mysql. nechcem to
prikladat do prilohy, neviem ci by to preslo cez mailing list, tak som
to vyvesil na http://st.fri.utc.sk/~janech/SQLAlterGenerator.tgz
Pre teba je dolezity subor generator/SQLParser.g

Ja som pred tym tiez parsoval vsetko cez regulare... ale hento mi dava
omnoho viac moznosti

> Na taketo veci sa hodia skor parser-generatory ako regularne vyrazy. Ja 
> pouzivam YAPPS (http://theory.stanford.edu/~amitp/yapps/). Konkretne SQL 
> som s nim uz parsoval.
> 
> 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?



Další informace o konferenci Python