如何根据行内容将行拆分为0,1或2个数组

时间:2013-09-12 19:51:39

标签: python regex

我正在编写一个程序,它将以四种结构之一接收输入行:

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,我确信有一种方法可以很容易地做到这一点,可能使用正则表达式。有吗?

修改:修改了所需的输出。

4 个答案:

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