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])

将一个字符串分配给其他字符串:

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 回答