Pyparsing嵌套表达式:在ParseResults中返回嵌套字符

问题描述:

我目前使用pyparsing来标识是否在字符串中使用了嵌套括号,以便识别错误地连接到单词的引用数字。Pyparsing嵌套表达式:在ParseResults中返回嵌套字符

例如,'apple(4)'。

我希望能够识别引用subtoken('(4)')。但是,当我使用searchString时,它返回[[7]]的ParseResults对象,该对象不提供括号。我想在原始标记中查找子字符串,所以我需要在ParseResults对象中包含嵌套字符。也就是说,我想搜索'(4)'。有没有办法让searchString返回嵌套字符。

+0

你能具体谈谈正是这些括号表达式可能看起来像,你需要支持嵌套? 'nestedExpr'是一个快速又脏兮兮的帮手,可以快速跳过嵌套的parens,大括号,括号等,从嵌套中保留结构。如果你只是想要原始子字符串,将'nestedExpr'包装在'originalTextFor'中,它应该包含括号'()'。但是如果你真的想弄懂内容,那么我建议你为它们定义实际的递归表达式。 – PaulMcG

问题:有没有办法让searchString返回嵌套字符。

考虑以下示例:

data = 'apple(4), banana(13), juice(1)' 

from pyparsing import Word, nums, alphas 

nested = Word(alphas) + '(' + Word(nums) + ')' 
for item in data.split((',')): 
    print(item, "->", nested.searchString(item)) 

输出

apple(4), ->[['apple', '(', '4', ')']] 
banana(13), ->[['banana', '(', '13', ')']] 
juice(1), ->[['juice', '(', '1', ')']] 

import re 

nObj = re.compile('(\w+?)(\(\d+\))') 
findall = nObj.findall(data) 
print('findall:{}'.format(findall)) 

输出

findall:[('apple', '(4)'), ('banana', '(13)'), ('juice', '(1)')] 

测试使用Python 3.4.2

+0

这个答案不支持嵌套,但是从OP的例子来看,实际上并不需要嵌套。你在这里有什么应该与原始示例文本正常工作。还有两件事你可以尝试 - 添加一个分析动作来自动将“Word(nums)”转换为一个int;并将结果名称添加到“苹果”和“4”数量,以便在解析结果中更方便地访问它们。 – PaulMcG

+0

@Paul:我用'(...)'解释了OP的“嵌套字符”。等待OP评论... – stovfl