我正在尝试使用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', ')']
所有我改变的是一组额外的括号,以及字符串内部括号的选项,这是所需字符串所具有的。我不确定为什么第一个程序什么都没给我,而第二个字符串给了我(部分)我想要的东西。
答案 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']]]
这正是我想要的。