1

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

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

4 回答 4

3

Consider:

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

This creates tuples, not lists, but that would be an easy fix.

于 2013-09-12T20:01:56.270 回答
2

只需使用正则表达式替换括号,然后在字符串末尾连接 [ 和 ]。

于 2013-09-12T19:54:02.113 回答
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']]]
于 2013-09-12T22:07:37.580 回答
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']]
于 2013-09-12T20:09:22.877 回答