2017-06-14 72 views
1

我目前使用pyparsing來標識是否在字符串中使用了嵌套括號,以便識別錯誤地連接到單詞的引用數字。Pyparsing嵌套表達式:在ParseResults中返回嵌套字符

例如,'apple(4)'。

我希望能夠識別引用subtoken('(4)')。但是,當我使用searchString時,它返回[[7]]的ParseResults對象,該對象不提供括號。我想在原始標記中查找子字符串,所以我需要在ParseResults對象中包含嵌套字符。也就是說,我想搜索'(4)'。有沒有辦法讓searchString返回嵌套字符。

+0

你能具體談談正是這些括號表達式可能看起來像,你需要支持嵌套? 'nestedExpr'是一個快速又髒兮兮的幫手,可以快速跳過嵌套的parens,大括號,括號等,從嵌套中保留結構。如果你只是想要原始子字符串,將'nestedExpr'包裝在'originalTextFor'中,它應該包含括號'()'。但是如果你真的想弄懂內容,那麼我建議你爲它們定義實際的遞歸表達式。 – PaulMcG

回答

1

問題:有沒有辦法讓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