4

Pythonとpyparsingが本当に役立つと確信しているタスクがありますが、完全な実装がどれほど難しいか、試してみる価値があるかどうかについて賢明な選択をするには、プログラミングの初心者がまだ多すぎます。実りのないタイムシンクになることは間違いありません。

タスクは、任意の長さとネストの深さの文字列を、次の一般的な文法に従った構造で変換することです。

item12345 'topic(subtopic(sub-subtopic), subtopic2), topic2'

このような辞書の項目に:

{item12345, 'topic, topic:subtopic, topic:subtopic:sub-subtopic, topic:subtopic2, topic2'}

言い換えると、論理は数学とまったく同じで、括弧のすぐ左にある項目が内部のすべてに分散され、「、」は、二項の因子に関して加算がどのように機能するかと同じように、括弧内の用語を示します。 。

私は自分自身で発見したか、これまでにこのソリューションを作成するために必要と思われる要素のいくつかの例を見つけて理解しました。

Pythonでネストされた式を解析する:

def parenthetic_contents(string):
"""Generate parenthesized contents in string as pairs (level, contents)."""
stack = []
for i, c in enumerate(string):
    if c == '(':
        stack.append(i)
    elif c == ')' and stack:
        start = stack.pop()
        yield (len(stack), string[start + 1: i])

1つの文字列を他の文字列に配布する:

from pyparsing import Suppress,Word,ZeroOrMore,alphas,nums,delimitedList

data = '''\
MSE 2110, 3030, 4102
CSE 1000, 2000, 3000
DDE 1400, 4030, 5000
'''

def memorize(t):
    memorize.dept = t[0]

def token(t):
    return "Course: %s %s" % (memorize.dept, int(t[0]))

course = Suppress(Word(alphas).setParseAction(memorize))
number = Word(nums).setParseAction(token)
line = course + delimitedList(number)
lines = ZeroOrMore(line)

final = lines.parseString(data)

for i in final:
    print i

他にもいくつかありますが、これらの方法は私の究極のソリューションには直接適用されません。Pythonを理解し、アイデアを組み合わせたり、新しいアイデアを見つけたりするのに十分なpyparsingを理解する前に、まだ方法があります。

私は例を探したり、同じように機能するものを探したり、Pythonやpyparsingのクラスやメソッドをもっと学んだりして、それを打ち負かしてきましたが、機能するものを作るのに十分な知識からどれだけ離れているかわかりません一般的なケースでは機能しない中間的な演習ではなく、私の完全なソリューションのために。

だから私の質問はこれらです。私が探していることを実行するために、最終的にどのくらい複雑なソリューションが必要になりますか?私が近づくのに役立つかもしれない提案はありますか?

前もって感謝します!(PS-StackOverflowの最初の投稿、この投稿に関して何か別のことをする必要があるかどうか教えてください)

4

1 に答える 1

2

pyparsingでは、例は次のようになります。

from pyparsing import Word,alphanums,Forward,Optional,nestedExpr,delimitedList

topicString = Word(alphanums+'-')
expr = Forward()
expr << topicString + Optional(nestedExpr(content=delimitedList(expr)))

test = 'topic(subtopic(sub-subtopic), subtopic2), topic2'

print delimitedList(expr).parseString(test).asList()

プリント

['topic', ['subtopic', ['sub-subtopic'], 'subtopic2'], 'topic2']

への変換topic:subtopicなどは、OPの演習として残されています。

于 2012-04-19T19:51:55.703 に答える