[EMAIL PROTECTED] 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. > > [EMAIL PROTECTED] 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? _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
