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

how to turn a string of letters embedded in squared brackets into embedded lists

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

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

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

>>> [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']]

使用字符串的isalpha方法将所有字符包在括号中:

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(' ', ','))
>>> 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']