我正在尝试使用 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', ')']
我所更改的只是一组额外的外部括号,以及字符串内的括号选项,所需的字符串具有这些选项。我不确定为什么第一个程序什么也没给我,而第二个字符串却给了我(部分)我想要的东西。
最佳答案
问题是 pyparsing 从左到右工作 (source)。因此,使用正确的括号会删除您在右侧搜索的内容。例如:
aSub = '(('+ pyp.Word('()'+pyp.srange('[A-Za-z0-9]'))
返回
['((', 'H2)(C(H3)))']
['((', 'H1)(Cl1))']
['((', '(C(H3))3))']
关于python - 找不到 pyparsing 预期的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057872/