6

私はPyparsingに不慣れです(そしてPythonにはかなり不慣れです)。私は自分の問題を、何がうまくいかないのかを説明する最も単純な形にまで減らしようとしました(おそらく、Pyparsingはまったく必要ないでしょう!)

「b7z4a2de c3」のように、文字と数字で構成される文字列があるとします。常に文字がありますが、数字はオプションです。これを個々の要素に解析して処理したいのですが、数字のない裸の文字がある場合は、その後に「デフォルト」の数字が1になるように変更すると便利です。そうすれば、すべての要素を一貫した方法で処理できます。次のように、setparseActionを使用してこれを実行できると思いました。

from pyparsing import *
teststring = "a2 b5 c9 d e z"
expected_letter = Word("ABCDEFGabcdefgzZxy", exact=1)
expected_number = Word(nums)
letter_and_number = expected_letter + expected_number
bare_letter = expected_letter
bare_letter.setParseAction( lambda s,l,t:  t.append("1") )
elements =  letter_and_number | bare_letter
line = OneOrMore(elements)
print line.parseString(teststring)

残念ながら、t.append()は、解析されたトークンのリストに「1」を追加するという、私が期待していることを実行しません。代わりに、次のエラーが発生します。TypeError:'str'オブジェクトを呼び出すことはできません。

私はおそらくここで本当に太っているだけですが、あなたの専門家の一人が私をまっすぐにしてください。

ありがとう

スティーブ

4

1 に答える 1

4

pyparsingについて理解するための基本的な概念の1つは、文字列のリストだけでは機能せず、解析された部分をParseResultsオブジェクトにアセンブルすることです。ParseResultsは、pyparsingで定義された豊富なデータ型であり、リストとして、または定義された結果名でParserElementから解析されたトークンがある場合はdictまたはオブジェクトとしてアクセスできます。

ただし、ParseResultsは簡単にアクセスできるように設計されていますが、更新できる方法には制限があります。内部的にpyparsingでは、一致する各式が小さなParseResultsオブジェクトを作成します。これが大きな式の一部である場合、その式は+=演算子を使用して断片を大きなParseResultsに累積します。

あなたの場合、「1」を含む小さなParseResultsを作成し、それをtに追加することで、渡されるParseResultsに追加できます。

t += ParseResults("1")

残念ながら、これはラムダとしては機能しません-試してみることができます

lambda s,l,t: t.__iadd__(ParseResults("1"))

しかし、これは少し賢すぎると感じます。

また、Optionalクラスを利用するために、パーサーを少し再考することもできます。末尾の数字はオプションの要素と考えてください。要素が欠落している場合に提供するデフォルト値を定義できます。私はあなたがちょうどであなたが望むものを定義することができると思います:

>>> letter = Word(alphas,exact=1)
>>> digit = Word(nums,exact=1)
>>> teststring= "a2 b5 c9 d e z"
>>> letter_and_digit = Combine(letter + Optional(digit, default="1"))
>>> print (sum(letter_and_digit.searchString(teststring)))
['a2', 'b5', 'c9', 'd1', 'e1', 'z1']

['a','2'], ['b','5']結合は、個別の文字と数字を文字列に再結合するために使用されます。そうでない場合、各一致は、などのようになります。

(通常、searchStringは単一要素リストのリストのように見えるParseResultsオブジェクトのリストを返します。これにsearchStringの結果を渡すことにより、sumそれらすべてを文字列の1つのParseResultsに追加します。)

于 2012-12-01T17:16:26.460 に答える