1

私はクレイジーな問題を抱えています。

私は次のようなものを解析するためにpyparsingを使用しようとしています:(ドットは重要でない抑制されたテキストです)

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

私が必要としているのは次のようなものです:(A要素とB要素を1つのリストに接続するため)

 [ [ [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要素が1つのリストで直接接続されていなかったため、これは受け入れられませんでした。

言及する価値があるのは

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

次の 2 つのオプションがあると思います。

  • テキストの解析方法を再考する
  • あなたが持っているものに満足して、後できれいにしてください:あなたはのようなリストを持っていますyour_list=[A,B,B,A,B,B]か?あなたはただすることができます

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

    +、2 つのリストを連結します(と で[B]表されます)。x[i+1]x[i+2]

于 2012-09-13T08:34:35.220 に答える