1

次のようなものを含むことができる文字列があります。

s = "'Mark, Bob','John'"

これを 3 つの文字列に解析する最良の方法は何ですか? 私はパイパーシングに本当に慣れていないので、あまりよく理解していないのではないかと心配しています

(編集) 申し訳ありませんが、あまり明確ではありませんでした。これは、文法と pyparsing を使用してファイルを解析するプログラムの一部です。これは、何をすべきかわからない入力の小さな部分です。これは、実際には 3 つの名前の配列を表す必要があります。これを取得したいと考えています。

ありがとう

4

2 に答える 2

8

実際には 3 つではなく 2 つの文字列が必要であると想定しています (引用符で判断)。

pyparsing を使用するには、解析したい形式を考えて書き留めることから始めます (これは、使用する解析ライブラリやツールに関係なく、実際には適切な最初のステップです)。必要に応じて厳密にすることができますが、この問題の単純/高レベルから始めましょう。準 BNF 形式を使用します。「*」は「0 回以上の繰り返し」を意味します。

list_of_names = quoted_string (',' quoted_string)*

「名前のリストは引用符で囲まれた文字列で、その後に 0 個以上のカンマと引用符で囲まれた文字列のペアが続きます。」

Pyparsing のクラスは名前を使用しますが、おそらくコーディングには少し冗長ですが、同じ形式にかなり正確に従います。

list_of_names = quotedString + ZeroOrMore(',' + quotedString)

Pyparse にはいくつかの一般的な式も含まれており、quotedString はその 1 つです。

を定義したlist_of_namesので、それを使用して入力を解析できます。

s = "'Mark, Bob','John'"
print list_of_names.parseString(s)

そして、次のようになります。

["'Mark, Bob'", ',', "'John'"]

まあ、それは醜いです。1 つには、区切りのコンマではなく、名前だけが必要です。したがって、次のように変更list_of_namesします。

list_of_names = quotedString + ZeroOrMore(Suppress(',') + quotedString)

そして今、それは少しクリーンアップされています:

["'Mark, Bob'", "'John'"]

引用符を保持するかどうかが明確ではありませんでした。通常、文字列を扱うときは、文字列の内容だけが必要で、文字列に引用符を含めないようにします。あなたは確かにこれを書くことができます:

for name in list_of_names.parseString(s):
    print name.strip("'")

しかし、この解析された出力でやりたいことがたくさんあるかもしれません。何かをするたびに引用符を取り除くのに苦労する必要はありません。

代わりに、解析アクション、つまり解析時に実行されるコールバックを定義して、これらの引用符をクリーンアップできます。Pyparsing には と呼ばれるものremoveQuotesが含まれており、次のようにパーサーに含めます。

quotedString.setParseAction(removeQuotes)

入力を再度解析すると、非常にきれいなリストが得られます。

['Mark, Bob', 'John']

最後に、フォームのリストを解析するこの作業something + ZeroOrMore(Suppress(delimiter) + something)は、特に区切り文字がコンマの場合に頻繁に発生します。そのため、pyparsing にはdelimitedList、同じものを発行するというヘルパー メソッドが含まれています。パーサー全体は次のようになります。

quotedString.setParseAction(removeQuotes)
list_of_names = delimitedList(quotedString)

parseStringそして、式のメソッドを呼び出してデータを抽出しますlist_of_names

于 2013-11-08T18:03:10.603 に答える