3

私は以前pyparsing、テキストの大きなチャンクを解析して、いくつかの数値を取得していました。私が解析しているテキストは次のようなものです。

asdkjh                  1      120   203
kajshd                  230   2309  2309
Activated Attempts      230   2309  2309
Activated Attempts      230   2309  2309
aksjdh                               300
...

文字列を検索し、指定された文字列の直後に続くすべての値をキャッチする必要がありました。私が書いたコードは次のようになり、正常に機能しています。

returnValue= 0

integer = pyparsing.Word(pyparsing.nums).setParseAction(lambda toks: int(toks[0]))
attempted = integer.setResultsName("attempted")
text = "Activated Attempts"

row = text + attempted
table = pyparsing.ZeroOrMore(pyparsing.Group(row) | pyparsing.SkipTo(row).suppress())

attempteds = [row.asDict() for row in table.parseString(self.sendLine("lts_pm p"))]

for attempted in attempteds:
    returnValue+= attempted["attempted"]

return returnValue

上記の場合、460が返されます。上記の関数は、指定された「アクティブ化された試行」を検索し、そのテキストが後に続く数値を格納し、数値を要約して返します。

ただし、同じスクリプトにさらに検索クエリを追加する必要があり、次のことを試しました。

text = pyparsing.Keyword("Activated Attempts") or pyparsing.Keyword("Non Attempts")

ただし、スクリプトは「Activated Attempts」のみをキャッチしてその数を返し、2番目のテキストを完全に無視します。Keywordこれでない場合の用途は何ですか?私も試しLiteralましたが、それでも成功しませんでした!

4

1 に答える 1

3
from pyparsing import *

data = '''
asdkjh                  1      120   203
kajshd                  230   2309  2309
Activated Attempts      230   2309  2309
Activated Attempts      230   2309  2309
aksjdh                               300
'''

eventParser = Group(Word(alphas) + Optional(Word(alphas)))
rowParser = Group(eventParser + delimitedList(Word(nums),White(" ")))
tableParser = ZeroOrMore(rowParser)

def getValue(attemptsList, term):
    value = 0
    for attempt in attemptsList:
        if ' '.join(attempt[0]) == term:
            value += int(attempt[1])
    return value

attempts = getValue(tableParser.parseString(data), "Activated Attempts")
print attempts

編集

ドキュメントから

キーワード-リテラルに似ていますが、直後に空白、句読点、またはその他の非キーワード文字を続ける必要があります。定義されたキーワードで始まる非キーワードの偶発的な一致を防ぎます。

于 2012-10-25T17:16:03.013 に答える