2

pyparsing を使用してテキストを解析しようとしています。私の機能を以下に示します。まず、私の辞書 (私の Web サイトで一般的に使用される用語の辞書) 内のすべての用語を含むリストを作成します。次に、この一般的に使用される単語のリストを文法に設定しました。次に、文法を使用して ZeroOrMore オブジェクトを構築します。最後に、文字列を解析し、文字列で見つかった一致を取得する必要があります。ただし、テキストの終わりが予期されていたことを訴える代わりに、ParseException がスローされます。

def map_dict_words(self, pbody):
        dict_terms = [term.term for term in Dictionary.objects()]
        look_for_these = oneOf(dict_terms, caseless=True).setResultsName("dict_words")
        parseobj = ZeroOrMore(look_for_these)
        matches = parseobj.parseString(pbody, parseAll=True)
        print matches

pyparsing のホームページhttp://pyparsing-public.wikispaces.com/FAQsの FAQ によると、パーサーに文字列全体を解析させたい場合は、文法に StringEnd() を入れるか、オプションの引数 parseAll=True を使用する必要があります。コードから parseAll=True を削除すると機能しますが、文字列全体を解析しません。

何か案は?

4

2 に答える 2

6

の代わりに、またはparseStringを使用することに関心があるかもしれません。とは異なり、これらの関数は、入力文字列内のすべてのコンテンツの完全な一致を要求するのではなく、入力をざっと見て一致を探します。 ジェネレーターを返すため、大きな入力テキストの場合、一致が見つかると一致します。scanStringsearchStringparseStringscanString

for toks,start,end in look_for_these.scanString(pbody):
    print toks[0], start, end

searchStringは単純なラッパーscanStringです (ただし、開始位置と終了位置は削除されます):

for t in look_for_these.searchString(pbody):
    print t[0]
于 2011-09-26T21:53:21.950 に答える
4

pyparse をより高度な正規表現と考えてください。を渡すとparseAll=True、文字列全体に一致することが期待され、すべてのバイトが文法の一部に限定されます。ただし、文法では、文字列に表示される単語の一部しか言及されていません。どういうわけか、それらの残りを説明する必要があります。

つまり、一般的な単語が「オウム」、「ホバークラフト」、「ウナギ」、「フィヨルド」であると仮定すると、次の正規表現に相当するものを作成しました。

/^(?P<dict_words>eels|fjords|hovercraft|parrot)*$/
于 2011-09-26T20:24:07.447 に答える