【问题标题】:Not finding the strings expected with pyparsing没有找到 pyparsing 所期望的字符串
【发布时间】:2014-01-30 05:25:55
【问题描述】:

我正在尝试使用 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))

我对@9​​87654327@ 的理解是输入(在单个输入的情况下,就像我一样)代表所有可能成功返回匹配的字符组合。

运行代码

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', ')']

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

【问题讨论】:

    标签: python string parsing python-2.7 pyparsing


    【解决方案1】:

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

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

    返回

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

    【讨论】:

    • 如果我不想包含右括号怎么办?如果我想要['((', 'H2)(C(H3)','))'] 之类的东西?我是否只需添加一行代码将该字符串分成两部分,然后将其附加到列表中?
    • @Dannnno 添加一行代码当然是一个合理的 hack,但它可能不是最简单/最快的。我现在无法提供更好的解决方案。
    • 如果您不希望包含右括号,则不应将其作为 Word 表达式的一部分。问题是 Word 不知道 2 个尾随 ') 是特殊的,因此它将它们包含在单词组的其余部分中。一些建议:查看 pyparsing nestedExpr。另外,我认为pyp.alphanumspyp.srange('[A-Za-z0-9') 更容易阅读。
    【解决方案2】:

    正如 Paul McGuire 在 cmets 中所建议的,我发现使用 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']]]
    

    这正是我想要的。

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多