【发布时间】:2015-04-22 12:59:30
【问题描述】:
我有'AB(AB(DDC)C)A(BAAC)DAB(ABC)'形式的字符串。
- 每个字符代表一个元素(
A、B、C或D)。 - 在括号之间,右侧是每个元素的子元素(可能不存在)。
例如,拥有'AB(AB(DDC)C)A(BAAC)DA',顶层将是AB(AB(DDC)C)A(BAAC)DA --> [A, B, A, D, A] 和相应的子级将是 [None, AB(DDC)C, BAAC, None, None]。子项也将被递归解析。
我在这里实现了一个解决方案:
def parse_string(string):
i = 0
parsed = []
while i < len(string):
if string[i] in ('A', 'B', 'C', 'D'):
parsed.append([string[i], None])
i += 1
elif string[i] == '(':
open_brakets = 1
i += 1
j = i
while open_brakets:
if string[j] == '(':
open_brakets += 1
elif string[j] == ')':
open_brakets -= 1
j += 1
# Parse the children as well
parsed[-1][-1] = parse_string(string[i:j - 1])
i = j
else:
i += 1
return parsed
print parse_string('AB(AB(DDC)C)A(BAAC)DAB(ABC)')
虽然我觉得有点丑,而且肯定效率不高。
我想知道是否有一种方法可以用 Python 以更清洁/更快/更优雅的方式实现这一点?允许使用外部库(特别是如果它们是用 C 编写的!:-P)。
更新
应该工作的其他字符串示例:
ABC(DAB(ACB)BBB(AAA)ABC)DCB
一般来说,字符串的长度是没有限制的,既没有孩子的数量,也没有他们的长度,也没有嵌套层级的数量。
【问题讨论】:
-
供将来参考,另请参阅:stackoverflow.com/questions/1656859/…
-
它帮助我解决了问题
标签: python parsing optimization