私は今晩pyparsing
を使い始めました。私は非常に効果的に働いているいくつかのソースを記述する複雑な文法を作りました。それは非常に簡単で非常に強力でした。しかし、私はParsedResults
と一緒に働くことにいくつかの問題を抱えています。ネストされたトークンを発見した順に反復処理できるようにする必要があります。私はそれを少しイライラしています。私は単純なケースに私の問題を抽象化しました:`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. ...
私はこれに違って接近するべきですか?