【问题标题】:Splitting strings within a list by commas while respecting parentheses在尊重括号的同时用逗号分隔列表中的字符串
【发布时间】:2014-04-22 12:20:33
【问题描述】:

我有一个列表,例如

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

【问题讨论】:

  • 您有两个问题;请一次只写一期。

标签: python string list split


【解决方案1】:

您可以使用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']

对于更复杂的拆分,请使用成熟的解析器。

【讨论】:

  • 是的,但它仍然以逗号分隔,所以列表中的第一项是 john(is,great) 作为 2 个字符串而不是 1 个字符串返回
  • @user3527972:正如我所说,您有两个不同的问题。 :-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多