将带有嵌套括号的字符串转换为嵌套列表,python
在Stack Overflow上还有其他问题提到这个,比如如何解析一个字符串并返回一个嵌套数组?
不过那些问题都讨论的是这种格式的列表:((abc)de(fg)))
,转换成这种形式:[['a','b','c'],'d','e',['f','g']]
。而我有一个这样的列表:
((wordOneWord2)OtherWord(FinalWord)))
我用从其他问题学到的方法处理这个嵌套列表,结果是:
[['w','o','r','d','O','n','e','W','o','r','d','2']'O','t','h','e','r','W','o','r','d',['F','i','n','a','l','W','o','r','d']]]
而不是我想要的结果:
[['wordOneWord2'], 'OtherWord', ['FinalWord']]
我可以通过逐字解析这个列表,然后把每个列表里的项目重新拼接起来,来得到我想要的结果,但我觉得这样写的代码有点多,不知道有没有更快的方法?
1 个回答
3
根据这个falsetru的解决方案:
import re
def parse_nested(text, left=r'[(]', right=r'[)]', sep=r','):
""" Based on https://stackoverflow.com/a/17141899/190597 (falsetru) """
pat = r'({}|{}|{})'.format(left, right, sep)
tokens = re.split(pat, text)
stack = [[]]
for x in tokens:
if not x or re.match(sep, x): continue
if re.match(left, x):
stack[-1].append([])
stack.append(stack[-1][-1])
elif re.match(right, x):
stack.pop()
if not stack:
raise ValueError('error: opening bracket is missing')
else:
stack[-1].append(x)
if len(stack) > 1:
print(stack)
raise ValueError('error: closing bracket is missing')
return stack.pop()
text = '((wordOneWord2)OtherWord(FinalWord))'
print(parse_nested(text))
# [[['wordOneWord2'], 'OtherWord', ['FinalWord']]]