2

私は次のようBase: Lote Numero 1, Marcelo T de Alvear 500. Demanda: otras palabras.に文を解析しようとしています。最初にテキストをピリオドで分割し、次にコロンの前にあるものをコロンlabelの後の文のとして使用します。今、私は次の定義を持っています:

from pyparsing import *

unicode_printables = u''.join(unichr(c) for c in xrange(65536) 
                                    if not unichr(c).isspace())

def parse_test(text):
    label = Word(alphas)+Suppress(':')
    value = OneOrMore(Word(unicode_printables)|Literal(','))
    group = Group(label.setResultsName('label')+value.setResultsName('value'))
    exp = delimitedList(
        group,
        delim='.'
    )

    return exp.parseString(text)

valueそして一種の作品ですが、それはユニコード文字(そしてアルファベットにないものは何でも)を落とします、そして私はこれではなく全体の文を持ちたいと思っています: 'value': [(([u'Lote', u'Numero', u'1', ',', u'Marcelo', u'T', u'de', u'Alvear', u'500'], {}), 1)

これに取り組む簡単な方法はありますか?

4

2 に答える 2

2

質問に直接答えるには、値の定義を でラップします。originalTextForこれにより、一致するトークンの元となった文字列スライスが単一の文字列として返されます。次のような解析アクションを追加することもできます。

value.setParseAction(lambda t : ' '.join(t))

ただし、スペースがない場合 (単語の後の「,」の場合)、または複数のスペースがある場合は、各項目の間に明示的に 1 つのスペースが挿入されます。 originalTextFor正確な入力部分文字列が得られます。しかし、「:」以降のすべてを読み取るだけの場合は、さらに簡単にrestOfLine. (もちろん、最も簡単なのは を使用split(':')することですが、pyparsing でこれを行う方法を具体的に尋ねていると思います。)

その他の注意事項:

  • xxx.setResultsName('yyy')を just に短縮してxxx('yyy')、パーサー定義の可読性を向上させることができます。

  • あなたの価値の定義にOneOrMore(Word(unicode_printables) | Literal(','))はいくつかの問題があります。たとえば、「,」は の文字セットに含まれるunicode_printablesため、「,」は解析された単語に含まれます。これを解決する最善の方法は、excludeCharsパラメーター toを使用しWordて、文の単語にコンマが含まれないようにすることです: OneOrMore(Word(unicode_printables, excludeChars=',') | ',')。これで、「;」、「-」などの他の可能な句読点を除外することもできます。excludeChars 文字列に追加するだけです。('.' を区切り文字として使用していることに気付きましたdelimitedList- これが機能するには、「.」を含める必要があります。除外された文字としても。) Pyparse は、この点で正規表現とは異なります。次の文字が現在のトークンと一致し続ける場合、パーサーで次のトークンと一致しようとする先読みは行いません。そのため、読みすぎないように、独自の追加作業を行う必要があります。一般に、OneOrMore(Word(unicode_printables))入力文字列の残り全体を使い果たす可能性が非常に高いので、制限のないものです。

于 2011-10-06T10:34:20.187 に答える
1

センテンス ファインダーを提供するBreakIteratorクラスなど、ICU が提供する豊富な Unicode テキスト ライブラリへのアクセスを提供するPyICUを調べる必要があります。

于 2011-10-06T02:17:42.523 に答える