[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