簡體   English   中英

python pyparsing字符串:A,b,b,b,A,b,b,b * [關閉]

[英]python pyparsing string: A,b,b,b,A,b,b,b* [closed]

我有一個瘋狂的問題。

我正在嘗試使用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元素的列表。

是的,您可以將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']]]

我認為您有兩種選擇:

  • 重新思考您解析文本的方式
  • 對自己擁有的東西保持滿意,然后事后清理:您有一個諸如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] )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM