1

次の 4 つの構造のいずれかで入力行を受け取るプログラムを作成しています。

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

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 に答える