使用pyparsing更正注释扫描

2024-10-06 23:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pyparsing在“createtable”后面添加分号(“;”)。如果我有这个输入:

CREATE TABLE A ( B VARCHAR(255) )

程序将给出下一个输出:

^{pr2}$

当周围有评论的时候,麻烦就来了,像这样:

CREATE TABLE A ( B VARCHAR(255) )
--Comment

如果计划提供:

CREATE TABLE A ( B VARCHAR(255) )
--Comment
;

代码如下:

import pyparsing as par

alphanumsword = par.Word(par.alphanums + "_")
element = "(" + alphanumsword + ")" | alphanumsword
row = par.OneOrMore(element)
rows = row + par.OneOrMore("," + row) | row

semicolon = par.Literal(";")
comment1 = par.Literal("--") + par.restOfLine + par.LineEnd()

createtable = par.CaselessLiteral("create") + par.CaselessLiteral("table") 
              + alphanumsword + "("     + rows + ")" + ~semicolon

createtable.ignore(comment1)
createtable.ignore(par.cStyleComment)

text = \
"""
CREATE TABLE  PERSON
(
    /* Comment */
    /*
       Comment
    */
   ID VARCHAR(255),
   NAME VARCHAR(255), -- Comment
   --- Comment
   ADDRESS VARCHAR(255) NULL, -- Comment
   CONSTRAINT PK_PERSON PRIMARY KEY (ID)
)

-- Comment

CREATE TABLE A ( B VARCHAR(255) )
"""

text_list = list(text)
offset = 0

for t,s,e in createtable.scanString(text):
    print "(", t, ",", s, ",", e, ")"

    print "||", text[s:e], "||"

    text_list.insert(e + offset, ';')
    offset += 1

print "".join(text_list)

Tags: textcreatetablecommentelementpyparsinglistoffset
1条回答
网友
1楼 · 发布于 2024-10-06 23:27:50

使用~( semicolon | comment1 )代替~( semicolon )。在

import pyparsing as par

alphanumsword = par.Word(par.alphanums + "_")

element = "(" + alphanumsword + ")" | alphanumsword
#element = alphanumsword + "(" + alphanumsword + ")" | alphanumsword

row = par.OneOrMore(element)

rows = row + par.OneOrMore("," + row) | row

semicolon = par.Literal(";")

comment1 = par.Literal(" ") + par.restOfLine + par.LineEnd()

createtable = par.CaselessLiteral("create") + par.CaselessLiteral("table")  \
              + alphanumsword + "("     + rows + ")" + ~( semicolon | comment1 )

createtable.ignore(comment1)
createtable.ignore(par.cStyleComment)


text = \
"""
 - this is comment

CREATE TABLE  PERSON
(
    /* Comment */
    /*
       Comment
    */
   ID VARCHAR(255),
   NAME VARCHAR(255),   Comment
    - Comment
   ADDRESS VARCHAR(255) NULL,   Comment
   CONSTRAINT PK_PERSON PRIMARY KEY (ID)
)

  Comment

CREATE TABLE A ( B VARCHAR(255) )  comment
CREATE TABLE A ( B VARCHAR(255) );
CREATE TABLE A ( B VARCHAR(255) )
CREATE TABLE A ( B VARCHAR(255) );

 Commentasfkjaskfj
"""

text_list = list(text)
offset = 0

for t,s,e in createtable.scanString(text):
    print "(***", t, ",", s, ",", e, "**)"

    print "||\n", text[s:e], "\n||"
    print "s: %d, e: %d" % (s, e)

    text_list.insert(e + offset , ';')
    offset += 1

    print "******************************"

print "".join(text_list)

输出

^{pr2}$

相关问题 更多 >