我有一个疯狂的问题。
我正在尝试使用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元素的列表。
答案 0 :(得分: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']]]
答案 1 :(得分:-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]
)。