ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pyparsing中使用QuotedString

2019-11-19 21:58:35  阅读:256  来源: 互联网

标签:pyparsing python parsing


我在理解如何构建pyparsing解析器时遇到概念上的困难.步骤是:1)通过组合ParserElement的子类来构建解析器,以及2)使用解析器来解析字符串.

以下示例可以正常工作:

from pyparsing import Word, Literal, alphas, alphanums, delimitedList, QuotedString

name = Word(alphas+"_", alphanums+"_")
field = name
fieldlist = delimitedList(field)
doc = Literal('<Begin>') + fieldlist + Literal('**End**')

dstring = '<Begin>abc,de34,f_o_o**End**'
print(doc.parseString(dstring))

产生预期的令牌序列:

['<Begin>', 'abc', 'de34', 'f_o_o', '**End**']

但是(例如),类QuotedString并不将ParserElement作为参数,因此不能用于构建解析器.我希望在上面的示例中使用它,例如:

name = Word(alphas+"_", alphanums+"_")
field = QuotedString(name)     ### Wrong: doesn't allow "name" as an argument
fieldlist = delimitedList(field)

解析以下形式的文档:

dstring = '<Begin>"abc", "de34", "f_o_o"**End**'

但是,由于不能以这种方式使用它,因此在构造引号字符串列表的解析器时包括QuotedString的正确语法是什么?

========编辑============

请参阅下面的答案…

解决方法:

QuotedString不能用于此任务.但是OR函数可以达到相同的效果-允许使用不同形式的引号,同时保留解析引号中包含的字符串的有效性的功能.下面的代码可以做到这一点:

from pyparsing import Word, Literal, alphas, alphanums, delimitedList
from pyparsing import Group, QuotedString, ParseException, Suppress

name = Word(alphas+"_", alphanums+"_")
field = Suppress('"') + name + Suppress('"') ^ \    # double quote
        Suppress("'") + name + Suppress("'") ^ \    # single quote
        Suppress("<") + name + Suppress(">") ^ \    # html tag
        Suppress("{{")+ name + Suppress("}}")       # django template variable
fieldlist = Group(delimitedList(field))
doc = Literal('<Begin>') + fieldlist + Literal('**End**')

dstring = [
    '<Begin>"abc","de34","f_o_o"**End**',      # Good
    '<Begin><abc>,{{de34}},\'f_o_o\'**End**',  # Good
    '<Begin>"abc",\'de34","f_o_o\'**End**',    # Bad - mismatched quotes
    '<Begin>"abc","de34","f_o#o"**End**',      # Bad - invalid identifier
]

for ds in dstring:
    print(ds)
    try:
        print('  ', doc.parseString(ds))
    except ParseException as err:
        print(" "*(err.column-1) + "^")
        print(err)

产生所需的输出,接受两个好的测试字符串,并拒绝两个不好的字符串:

<Begin>"abc","de34","f_o_o"**End**
   ['<Begin>', ['abc', 'de34', 'f_o_o'], '**End**']
<Begin><abc>,{{de34}},'f_o_o'**End**
   ['<Begin>', ['abc', 'de34', 'f_o_o'], '**End**']
<Begin>"abc",'de34","f_o_o'**End**
            ^
Expected "**End**" (at char 12), (line:1, col:13)
<Begin>"abc","de34","f_o#o"**End**
                   ^
Expected "**End**" (at char 19), (line:1, col:20)

感谢Paul的所有帮助,并感谢您提供了如此出色的包装.

标签:pyparsing,python,parsing
来源: https://codeday.me/bug/20191119/2039231.html

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

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

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

ICode9版权所有