私は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
とを区別できずnumber
、direct_speech
要素にはword
?!というラベルが付けられています。
私は明らかに何かが欠けています。私がやりたいことは次のとおりです。
for item in r.sentence:
if (item is a number):
do something
elif (item is a word):
do something else
etc. ...
これに別の方法でアプローチする必要がありますか?