6

私はpyparsing今晩使い始めたばかりで、非常に効果的に作業しているいくつかの情報源を説明する複雑な文法を構築しました. とても簡単でとてもパワフルでした。ただし、での作業に問題がありParsedResultsます。ネストされたトークンを見つかった順に繰り返し処理できるようにする必要がありますが、少しイライラしています。問題を単純なケースに抽象化しました。

import pyparsing as pp

word = pp.Word(pp.alphas + ',.')('word*')
direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word))('direct_speech*') + pp.Suppress('”')
sentence = pp.Group(pp.OneOrMore(word | direct_speech))('sentence')

test_string = 'Lorem ipsum “dolor sit” amet, consectetur.'

r = sentence.parseString(test_string)

print r.asXML('div')

print ''

for name, item in r.sentence.items():
    print name, item

print ''

for item in r.sentence:
    print item.getName(), item.asList()

私が見る限り、これはうまくいくはずですか?出力は次のとおりです。

<div>
  <sentence>
    <word>Lorem</word>
    <word>ipsum</word>
    <direct_speech>
      <word>dolor</word>
      <word>sit</word>
    </direct_speech>
    <word>amet,</word>
    <word>consectetur.</word>
  </sentence>
</div>

word ['Lorem', 'ipsum', 'amet,', 'consectetur.']
direct_speech [['dolor', 'sit']]

Traceback (most recent call last):
  File "./test.py", line 27, in <module>
    print item.getName(), item.asList()
AttributeError: 'str' object has no attribute 'getName'

XML 出力は、文字列が希望どおりに正確に解析されていることを示しているようですが、たとえば、文を再構築するために文を反復処理することはできません。

必要なことを行う方法はありますか?

ありがとう!

編集:

私はこれを使用しています:

for item in r.sentence:
    if isinstance(item, basestring):
        print item
    else:
        print item.getName(), item

しかし、文字列の種類を区別できないため、あまり役に立ちません。少し拡張した例を次に示します。

word = pp.Word(pp.alphas + ',.')('word*')
number = pp.Word(pp.nums + ',.')('number*')

direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word | number))('direct_speech*') + pp.Suppress('”')
sentence = pp.Group(pp.OneOrMore(word | number | direct_speech))('sentence')

test_string = 'Lorem 14 ipsum “dolor 22 sit” amet, consectetur.'

r = sentence.parseString(test_string)

for i, item in enumerate(r.sentence):
    if isinstance(item, basestring):
        print i, item
    else:
        print i, item.getName(), item

出力は次のとおりです。

0 Lorem
1 14
2 ipsum
3 word ['dolor', '22', 'sit']
4 amet,
5 consectetur.

あまり役に立ちません。wordとを区別できずnumberdirect_speech要素にはword?!というラベルが付けられています。

私は明らかに何かが欠けています。私がやりたいことは次のとおりです。

for item in r.sentence:
    if (item is a number):
        do something
    elif (item is a word):
        do something else
etc. ...

これに別の方法でアプローチする必要がありますか?

4

2 に答える 2

1

さて、私は今、さまざまなアプローチを試しましたが、必要なものを得ることができませんでした.asXML(). これが私の例です:

import pyparsing as pp

word = pp.Word(pp.alphas + ',.')('word*')
number = pp.Word(pp.nums + ',.')('number*')
direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word | number))('direct_speech*') + pp.Suppress('”')
sentence = pp.Group(pp.OneOrMore(word | number | direct_speech))('sentence')

test_string = 'Lorem 14 ipsum “dolor 22 sit” amet, consectetur.'
r = sentence.parseString(test_string)

from lxml import etree
xml = etree.fromstring(r.sentence.asXML('sentence'))
for el in xml:
    if len(el):
        print el.tag
        for sub_el in el:
            print '  ', sub_el.tag, ':', sub_el.text
    else:
        print el.tag, ':',  el.text

出力:

word : Lorem
number : 14
word : ipsum
direct_speech
   word : dolor
   number : 22
   word : sit
word : amet,
word : consectetur.

家々を回るには長い道のりのように思えますが、これ以上の方法はないようです。

于 2013-05-23T07:07:11.123 に答える