如何将嵌入方括号中的字母串转换为嵌入式列表

时间:2015-10-15 11:58:56

标签: python regex string-parsing brackets

我试图找到一种简单的方法来转换像这样的字符串:

a = '[[a b] [c d]]'

进入相应的嵌套列表结构,其中字母转换为字符串:

a = [['a', 'b'], ['c', 'd']]

我尝试使用

import ast
l = ast.literal_eval('[[a b] [c d]]')
l = [i.strip() for i in l]

找到here

但它不起作用,因为字符a,b,c,d不在引号内。

特别是我正在寻找转变的东西:

'[[X v] -s]'

成:

[['X', 'v'], '-s']

3 个答案:

答案 0 :(得分:5)

您可以使用正则表达式查找括号之间的所有项目,然后拆分结果:

>>> [i.split() for i in re.findall(r'\[([^\[\]]+)\]',a)]
[['a', 'b'], ['c', 'd']]

正则表达式r'\[([^\[\]]+)\]'将匹配除方括号之外的方括号之间的任何内容,在本例中为'a b''c d',然后您只需使用列表推导来分割字符。

请注意,此正则表达式适用于这样的情况,其中所有字符都在括号之间,而对于另一种情况,您可以编写相应的正则表达式,而不是正则表达式滴答在所有情况下都不起作用。

>>> a = '[[a b] [c d] [e g]]'
>>> [i.split() for i in re.findall(r'\[([^\[\]]+)\]',a)]
[['a', 'b'], ['c', 'd'], ['e', 'g']]

答案 1 :(得分:2)

使用isalpha string方法将所有字符括在括号中:

a = '[[a b] [c d]]'

a = ''.join(map(lambda x: '"{}"'.format(x) if x.isalpha() else x, a))

现在a是:

'[["a" "b"] ["c" "d"]]'

你可以使用json.loads(提供@a_guest):

json.loads(a.replace(' ', ','))

答案 2 :(得分:1)

>>> import json
>>> a = '[[a b] [c d]]'
>>> a = ''.join(map(lambda x: '"{}"'.format(x) if x.isalpha() else x, a))
>>> a
'[["a" "b"] ["c" "d"]]'
>>> json.loads(a.replace(' ', ','))
[[u'a', u'b'], [u'c', u'd']]

这适用于遵循上述模式的任何程度的嵌套列表,例如

>>> a = '[[[a b] [c d]] [[e f] [g h]]]'
>>> ...
>>> json.loads(a.replace(' ', ','))
[[[u'a', u'b'], [u'c', u'd']], [[u'e', u'f'], [u'g', u'h']]]

有关'[[X v] -s]'的具体示例:

>>> import json
>>> a = '[[X v] -s]'
>>> a = ''.join(map(lambda x: '"{}"'.format(x) if x.isalpha() or x=='-' else x, a))
>>> json.loads(a.replace('[ [', '[[').replace('] ]', ']]').replace(' ', ',').replace('][', '],[').replace('""',''))
[[u'X', u'v'], u'-s']