我正在编写一个程序,它将以四种结构之一接收输入行:
a,b
(a,b,c),d
a,(b,c,d)
(a,b),(c,d)
每个括号内的成员数量可能会发生变化。现在,我想将上述每一行翻译成以下
['a','b']
[['a','b','c'],'d']
['a',['b','c','d']]
[['a','b'],['c','d']]
我可以想办法通过检查每个字符来做到这一点,但是知道python,我确信有一种方法可以很容易地做到这一点,可能使用正则表达式。有吗?
修改:修改了所需的输出。
答案 0 :(得分:3)
考虑:
import re, ast
input = """
a,b
(a,b,c),d
a,(b,c,d)
(a,b),(c,d)
"""
input = re.sub(r'(\w+)', r"'\1'", input)
for line in input.strip().splitlines():
print ast.literal_eval(line)
> ('a', 'b')
> (('a', 'b', 'c'), 'd')
> ('a', ('b', 'c', 'd'))
> (('a', 'b'), ('c', 'd'))
这会创建元组,而不是列表,但这很容易解决。
答案 1 :(得分:2)
只需使用正则表达式替换括号,然后在字符串末尾连接[和]。
答案 2 :(得分:1)
不要使用正则表达式。改为使用堆栈:
def parse(inputstring):
result = []
stack = [result]
value = ''
for char in inputstring:
if char == '(':
# new context
if value:
stack[-1].append(value)
value = ''
stack[-1].append([])
stack.append(stack[-1][-1])
elif char == ')':
if value:
stack[-1].append(value)
value = ''
# pop off context
stack.pop()
elif char == ',':
if value:
stack[-1].append(value)
value = ''
else:
value += char
if value:
stack[-1].append(value)
return result
演示:
>>> parse('a,b')
['a', 'b']
>>> parse('(a,b,c),d')
[['a', 'b', 'c'], ',d']
>>> parse('a,(b,c,d)')
['a', ['b', 'c', 'd']]
>>> parse('(a,b),(c,d)')
[['a', 'b'], ['c', 'd']]
答案 3 :(得分:1)
你可以这样做:
import re
st = """
a,b
(a,b,c),d
a,(b,c,d)
(a,b),(c,d)
"""
def element(e):
e=e.strip()
e=re.sub(r'(\w+)',r'"\1"', e)
e=e.replace('(','[')
e=e.replace(')',']')
code=compile('temp={}'.format(e), '<string>', 'exec')
exec code
return list(temp)
print [element(x) for x in st.splitlines() if x.strip()]
# [['a', 'b'], [['a', 'b', 'c'], 'd'], ['a', ['b', 'c', 'd']], [['a', 'b'], ['c', 'd']]]