没有找到pyparsing预期的字符串

时间:2014-01-11 02:33:07

标签: python string parsing python-2.7 pyparsing

我正在尝试使用pyparsing解析字符串。使用下面的代码

import pyparsing as pyp

aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))"

aSub = '(('+ pyp.Word('()'+pyp.srange('[A-Za-z0-9]'))+'))'
substituent = aSub('sub')

for t,s,e in substituent.scanString(aString):
    print t.sub

我没有输出。但是,在字符串aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))"中,((stuff))出现了多次 - 特别是((H2)(C(H3)))C((H1)(Cl1))C(((C(H3))3))

我对Word()的理解是输入(在我输入的单个输入的情况下)表示将成功返回匹配的所有可能的字符组合。

运行代码

import pyparsing as pyp

aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))"

aSub = '(' + pyp.Word(pyp.srange('[A-Za-z0-9]'))+')'
substituent = aSub('sub')

for t,s,e in substituent.scanString(aString):
    print t.sub

输出

['(', 'H2', ')']
['(', 'H3', ')']
['(', 'H1', ')']
['(', 'Cl1', ')']
['(', 'H3', ')']

所有我改变的是一组额外的括号,以及字符串内部括号的选项,这是所需字符串所具有的。我不确定为什么第一个程序什么都没给我,而第二个字符串给了我(部分)我想要的东西。

2 个答案:

答案 0 :(得分:2)

问题在于从左到右(source)的pyparsing工作。因此,使用右括号会删除您在右侧搜索的内容。例如:

aSub = '(('+ pyp.Word('()'+pyp.srange('[A-Za-z0-9]')) 

返回

['((', 'H2)(C(H3)))']
['((', 'H1)(Cl1))']
['((', '(C(H3))3))']

答案 1 :(得分:1)

根据Paul McGuire的评论中的建议,我发现使用nestedExpr是我情况的最佳选择。使用以下代码

import pyparsing as pyp

aString = "C((H2)(C(H3))) C((H1)(Cl1)) C((C(H3))3)"
aList = aString.split()

for i in range(len(aList)):
    aList[i] = [pyp.nestedExpr().parseString(aList[i][1:]).asList()[0]]

print aList

我得到了

的输出
[[[['H2'], ['C', ['H3']]]], [[['H1'], ['Cl1']]], [[['C', ['H3']], '3']]]

这正是我想要的。