ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 使用pyparsing更正注释

2019-07-04 05:44:14  阅读:227  来源: 互联网

标签:python pyparsing


我正在使用pyparsing在“CREATE TABLE”之后添加分号(“;”).如果我有这个输入:

CREATE TABLE A ( B VARCHAR(255) )

该程序将提供下一个输出:

CREATE TABLE A ( B VARCHAR(255) );

当有评论时会出现问题,例如:

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)

解决方法:

使用〜(分号| comment1)代替〜(分号).

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)

输出:

(*** ['create', 'table', 'PERSON', '(', 'ID', 'VARCHAR', '(', '255', ')', ',', 'NAME', 'VARCHAR', '(', '255', ')', ',', 'ADDRESS', 'VARCHAR', '(', '255', ')', 'NULL', ',', 'CONSTRAINT', 'PK_PERSON', 'PRIMARY', 'KEY', '(', 'ID', ')', ')'] , 22 , 243 **)
||
CREATE TABLE  PERSON
(
    /* Comment */
    /*
       Comment
    */
   ID VARCHAR(255),
   NAME VARCHAR(255), -- Comment
   --- Comment
   ADDRESS VARCHAR(255) NULL, -- Comment
   CONSTRAINT PK_PERSON PRIMARY KEY (ID)
) 
||
s: 22, e: 243
******************************
(*** ['create', 'table', 'A', '(', 'B', 'VARCHAR', '(', '255', ')', ')'] , 257 , 290 **)
||
CREATE TABLE A ( B VARCHAR(255) ) 
||
s: 257, e: 290
******************************
(*** ['create', 'table', 'A', '(', 'B', 'VARCHAR', '(', '255', ')', ')'] , 336 , 369 **)
||
CREATE TABLE A ( B VARCHAR(255) ) 
||
s: 336, e: 369
******************************

--- 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

标签:python,pyparsing
来源: https://codeday.me/bug/20190704/1374071.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有