在列表中按逗号分割字符串,同时尊重括号

2 投票
2 回答
5584 浏览
提问于 2025-04-18 03:44

我有一个这样的列表:

a = ['john(is,great),paul,school', 'robert,jack,john']

然后我创建了一个空列表,准备把分开的内容添加进去:

b = []

接着我这样做:

for i in a:
    b.append(i.split(','))

但是列表的结果却是这样的:

[['john(is', 'great)', 'paul', 'school'], ['robert', 'jack', 'john']]

这是因为它是按照逗号来分割的,但有没有其他方法可以分割,这样输出的结果会是:

['john(is,great)', 'paul', 'school', 'robert', 'jack', 'john']

2 个回答

1

如果你不喜欢用正则表达式,也可以创建一个过程:

def splitter(s):
    """Splits a string s on commas, but only if the comma
    is not surrounded by parentheses."""
    if '(' in s and ')' in s:
        start = s.find('(')
        end = s.find(')')
        new = s[start:end].replace(",", "@#$")
        s = s[:start] + new + s[end:]
        return [x.replace("@#$", ",") for x in s.split(",")]
    return s.split(',')

example = ['john(is,great),paul,school','robert,jack,john']

result = list()

for i in example:
    result.append(splitter(i))

print result
# [['john(is,great)', 'paul', 'school'], ['robert', 'jack', 'john']]
6

你可以使用 list.extend() 方法来逐个添加元素:

for i in a:
    b.extend(i.split(','))

如果你想在不包括括号内的情况下,根据逗号来分割文本,可以使用下面这个正则表达式:

re.split(r',(?=[^()]*(?:\(|$))', i)

这个表达式会在逗号后面没有任何括号(开括号或闭括号)并且直到下一个开括号的文本时进行分割。对于简单的情况,这个表达式是有效的,但如果有嵌套的括号,它就不太好用了:

>>> import re
>>> i = 'john(is,great),paul,school'
>>> re.split(r',+(?=[^()]*(?:\(|$))', i)
['john(is,great)', 'paul', 'school']

如果需要更复杂的分割,建议使用一个完整的解析器。

撰写回答