1

我有一个疯狂的问题。

我正在尝试使用 pyparsing 来解析这样的内容:(点是不重要的抑制文本)

...... A
B .......
B .......
...... A
B .......
B .......

我需要的是这样的:(将 A 和 B 元素连接到一个列表中)

 [ [ [A],[B,B] ], [ [A],[B,B] ] , ...]

这是我的代码,它不起作用,只返回第一个 [A]

table = pyparsing.OneOrMore(pyparsing.Group(A + (pyparsing.OneOrMore(pyparsing.Group(B) | pyparsing.SkipTo(B).suppress()))) | pyparsing.SkipTo(A).suppress())

我已经解决了这个 pyparsing 成这样的列表:

[ [A],[B],[B], [A],[B],[B] , ...]

但这是不可接受的,因为 A 和 B 元素没有直接连接在一个列表中。

值得一提的是

table1 = pyparsing.ZeroOrMore(pyparsing.Group(A) | pyparsing.SkipTo(A).suppress())
table2 = pyparsing.ZeroOrMore(pyparsing.Group(B) | pyparsing.SkipTo(B).suppress())

工作并返回所有 A 元素和 B 元素的列表。

4

2 回答 2

1

是的,您可以将 OneOrMore 嵌入到其他 OneOrMore 中 - 如果您不能编写,它将严重限制您可以编写的解析器。

如果您进行更好的分组,我认为您可能能够调整现有的解决方案。查看此玩具示例中如何定义组:

test = """
...... A 
B ....... 
B ....... 
...... A 
B ....... 
B ......."""

from pyparsing import Literal, Word, printables, Group, OneOrMore

A = Literal("A")
B = Literal("B")

notAorB = Word(printables, excludeChars="AB")

parser = OneOrMore(Group(A + Group(OneOrMore(B))))
parser.ignore(notAorB)

print parser.parseString(test).asList()

印刷:

[['A', ['B', 'B']], ['A', ['B', 'B']]]
于 2012-09-13T13:08:25.163 回答
-1

我认为你有两个选择:

  • 重新思考解析文本的方式
  • 对你所拥有的东西保持满意,然后把东西清理干净:你有一个类似的清单your_list=[A,B,B,A,B,B]吗?你可以做

    [ [x[i], x[i+1] + x[i+2]] for i in range(len(your_list)//3)]
    

    +连接您的两个[B]列表(表示为x[i+1]x[i+2])。

于 2012-09-13T08:34:35.220 回答