2012-04-19 51 views
4

我有一個任務要做,我確信Python和pyparsing可以真正起到幫助作用,但是我仍然對編程有太多的新手來做出一個明智的選擇,以明確完成實現的難度和無論是值得嘗試還是肯定會成爲一個沒有結果的時間。使用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]) 

分發一個字符串給他人:

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 - 在計算器上的第一篇文章,讓我知道如果我需要關於這篇文章做不同的事情)

+0

在我有限的經驗,這是一個非常好的職位。它描述了你想要在適當的通用性/特異性水平上做什麼,並顯示了有用的代碼量。在技​​術上,你會在最後一段的簽名中皺眉頭,但在第一篇文章中有合理的反饋意見,我認爲這很好。 – octern 2012-04-19 20:39:06

+0

很高興知道,並感謝您的反饋。我會盡量在未來避免這種簽字。 – 2012-04-20 00:17:21

+0

@CharlesW偏離帖子(或元標題,即帖子附件)的項目可作爲評論放入。有關更長時間的討論,請轉到http://meta.stackoverflow。COM /。 [FAQ](http://stackoverflow.com/faq)是寫出一個好問題的好建議。在你的情況下,儘量避免「幫助我靠近」,而是要求一個(單數)具體的,尖銳的問題。 – Hooked 2012-04-20 14:56:06

回答

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的練習。

+0

謝謝,保羅。這很好,因爲它包含了我不明白的健康數量的東西,同時又足夠簡短,足以讓我有機會通過它。一旦我明白你給我的更好一點,我會稍後再回來標記你的答案。 – 2012-04-19 20:25:39

+0

我沒有使用Group類,但也查看了它,以瞭解如何保持主題與各自可選的括號內的子主題之間的關係。 – PaulMcG 2012-04-20 12:01:20

+0

我昨天花了大部分時間試圖排除這個問題,所以我很欣賞這個提示。 – 2012-04-20 15:15:44