gpt4 book ai didi

python - 在 pyparsing 中使用 QuotedString

转载 作者:太空狗 更新时间:2023-10-30 02:59:10 25 4
gpt4 key购买 nike

我在理解如何构建 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 提供的所有帮助以及制作如此出色的软件包。

关于python - 在 pyparsing 中使用 QuotedString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32148790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com