Python 如何从pyparsing标记获取原始文本

Python 如何从pyparsing标记获取原始文本,python,pyparsing,Python,Pyparsing,我有一个形式为name(sum(value1,sum(value2,value3)),“sumname”)的文本,pyparsing返回适当的标记,但是,我对返回真实文本感兴趣,我找不到如何返回 我尝试过使用函数setParseAction,但因为它只返回字符串和位置,所以我无法处理后面的部分。 比如,我只会得到: "sum(value2,value3)), "sumname")" "sum(value1,sum(value2,value3)), "sumname")" "name(sum(va

我有一个形式为
name(sum(value1,sum(value2,value3)),“sumname”)
的文本,pyparsing返回适当的标记,但是,我对返回真实文本感兴趣,我找不到如何返回

我尝试过使用函数setParseAction,但因为它只返回字符串和位置,所以我无法处理后面的部分。 比如,我只会得到:

"sum(value2,value3)), "sumname")"
"sum(value1,sum(value2,value3)), "sumname")"
"name(sum(value1,sum(value2,value3)), "sumname")"
这并不理想,我不想手动重新分析字符串以获得实际的原始字符串

我尝试atm的方式是:

tokens = grammar.parseString(target_string)  
print >>sys.stderr, pyparsing.originalTextFor(tokens)
但这并没有真正起作用:

AttributeError: 'NoneType' object has no attribute 'setParseAction'

将表达式包装在pyparsing助手
originalTextFor

from pyparsing import makeHTMLTags, originalTextFor

sample = '<tag attr1="A1" attr2="B3">'

openTag = makeHTMLTags('tag')[0]

# the expression returned by makeHTMLTags parses the tag and 
# attributes into a list (along with a series of helpful 
# results names)
print (openTag.parseString(sample).asList())

# prints
# ['tag', ['attr1', 'A1'], ['attr2', 'B3'], False]

# wrap in 'originalTextFor' to get back the original source text
print (originalTextFor(openTag).parseString(sample).asList())

# prints
# ['<tag attr1="A1" attr2="B3">']
从pyparsing导入makeHTMLTags,originalTextFor
样本=“”
openTag=makeHTMLTags('tag')[0]
#makeHTMLTags返回的表达式解析标记并
#属性(以及一系列有用的
#结果(名称)
打印(openTag.parseString(sample.asList())
#印刷品
#['tag',['attr1','A1'],['attr2','B3'],False]
#使用“originalTextFor”换行以返回原始源文本
打印(originalTextFor(openTag).parseString(sample.asList())
#印刷品
# ['']

根据您试图通过获取原始匹配文本来完成的任务,您可能会使用
scanString
transformString
找到更好的解决方案:

from pyparsing import makeHTMLTags, replaceWith

sample = '<other><div></div><tag attr1="A1" attr2="B3"><something>'
openTag = makeHTMLTags('tag')[0]

# grammar.scanString is a generator, yielding tokens,start,end tuples
# from the start:end values you can slice the original text from the
# source string
for tokens,start,end in openTag.scanString(sample):
    print tokens.dump()
    print sample[start:end]

# if your goal in getting the original data is to do some kind of string
# replacement, use transformString - here we convert all <TAG> tags to <REPLACE> tags
print openTag.setParseAction(replaceWith("<REPLACE>")).transformString(sample)
从pyparsing导入makeHTMLTags,替换为
样本=“”
openTag=makeHTMLTags('tag')[0]
#scanString是一个生成器,生成标记、开始元组和结束元组
#从开始:结束值您可以从
#源字符串
对于令牌,在openTag.scanString(示例)中开始和结束:
打印令牌。dump()
打印示例[开始:结束]
#如果您获取原始数据的目标是执行某种字符串
#替换,使用transformString-这里我们将所有标记转换为标记
打印openTag.setParseAction(替换为(“”).transformString(示例)
印刷品:

['tag', ['attr1', 'A1'], ['attr2', 'B3'], False]
- attr1: A1
- attr2: B3
- empty: False
- startTag: ['tag', ['attr1', 'A1'], ['attr2', 'B3'], False]
  - attr1: A1
  - attr2: B3
  - empty: False
  - tag: tag
- tag: tag
<tag attr1="A1" attr2="B3">
<other><div></div><REPLACE><something>
['tag',['attr1','A1'],['attr2','B3'],False]
-属性1:A1
-属性2:B3
-空:假
-开始标记:['tag',['attr1','A1'],['attr2','B3'],False]
-属性1:A1
-属性2:B3
-空:假
-标签:标签
-标签:标签

请按照这些链接查看和的更多信息。

嗨,这对我来说是失败的
tokens=grammar.parseString(target_string)
print>>sys.stderr,pyparsing.originalTextFor(tokens)
我怀疑这是因为parseString返回的是ParseResults,而不是ParseElements
originalTextFor
包装语法,而不是结果。试试
originalTextFor(grammar).parseString(tokens)
。我看到了,但是,您一直在提供原始字符串,而我所拥有的只是parseString的结果,我需要返回该字符串。您将一个字符串传递给parseString是有意义的,但我没有字符串,只有一组标记。我的错误应该是:
originalTextFor(语法)。parseString(目标字符串)
originalTextFor
是语法的修饰符,在解析时更改其行为。语法匹配后,
originalTextFor
将语法返回的内容替换为语法匹配的原始文本。您必须修改解析时间行为,因为这是您在解析语法表达式时唯一可以访问确切开始/停止位置的时间。您可能需要添加指向API说明的链接以及有关这两个函数如何工作的更多详细信息。我不明白发生了什么,为什么事情会像上面描述的那样,我也不明白为什么这两个有点模糊的函数比直接使用parseResults或action中的标记更好。感谢您的反馈,我已经按照您的建议添加了doc链接。我本来希望嵌入的注释能够解释这个脚本中发生了什么,但我猜它们对pyparsing的工作原理有太多的了解。