【发布时间】:2020-06-07 04:33:06
【问题描述】:
假设我有一个字符串s = '{aaaa{bc}xx{d{e}}f}',它具有嵌套列表的结构。我想对其进行分层表示,同时能够访问与有效子列表相对应的子字符串。为简单起见,让我们忘记层次结构,我只想要一个与有效子列表相对应的子字符串列表,例如:
['{aaaa{bc}xx{d{e}}f}', '{bc}', '{d{e}}', '{e}']
使用nestedExpr,可以获得嵌套结构,其中包含所有有效的子列表:
import pyparsing as pp
s = '{aaaa{bc}xx{d{e}}f}'
not_braces = pp.CharsNotIn('{}')
expr = pp.nestedExpr('{', '}', content=not_braces)
res = expr('L0 Contents').parseString(s)
print(res.dump())
打印:
[['aaaa', ['bc'], 'xx', ['d', ['e']], 'f']]
- L0 Contents: [['aaaa', ['bc'], 'xx', ['d', ['e']], 'f']]
[0]:
['aaaa', ['bc'], 'xx', ['d', ['e']], 'f']
[0]:
aaaa
[1]:
['bc']
[2]:
xx
[3]:
['d', ['e']]
[0]:
d
[1]:
['e']
[4]:
f
为了获得解析元素的原始字符串表示,我必须将它包装到pyparsing.originalTextFor()。但是,这将从结果中删除所有子列表:
s = '{aaaa{bc}xx{d{e}}f}'
not_braces = pp.CharsNotIn('{}')
expr = pp.nestedExpr('{', '}', content=not_braces)
res = pp.originalTextFor(expr)('L0 Contents').parseString(s)
print(res.dump())
打印:
['{aaaa{bc}xx{d{e}}f}']
- L0 Contents: '{aaaa{bc}xx{d{e}}f}'
实际上,originalTextFor() 包装器扁平化了其中的所有内容。
问题。是否有替代originalTextFor() 的方法来保留其子解析元素的结构? (如果有一个不可丢弃的类似物会很好,它可以用于为已解析的子表达式创建命名标记)
请注意,scanString() 只会给我 0 级子列表,不会查看内部。我想,我可以使用setParseAction(),但是ParserElement 的内部操作模式没有记录,我还没有机会深入研究源代码。谢谢!
更新1.有点相关:https://stackoverflow.com/a/39885391/11932910https://stackoverflow.com/a/17411455/11932910
【问题讨论】:
-
你感兴趣的输出是什么?
-
我希望您不必深入研究 pyparsing 的内部结构来获得这种东西。解析动作可以操纵解析结果,然后将它们按修改后返回给 pyparsing。此外,您可以在pyparsing-docs.readthedocs.io/en/pyparsing_2.4.6/pyparsing.html 了解更多关于类和助手的广度
-
@Roy2012 我感兴趣的输出在第一个代码块引用中。