2014-04-22 78 views
2

我有一个列表,如分割字符串的Python列表

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)显示为一个字符串如john(is,great)

+0

你这里有** 2点**的问题;请一次保留一个问题。 –

回答

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

对于更复杂的分割,利用全面的解析。

+0

是的,但它仍然在逗号分开,所以第一个项目是在列表中,这是约翰(是,伟大)返回为2个字符串,而不是1字符串 – user3527972

+0

@ user3527972:正如我所说,你有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']]