在列表中按逗号分割字符串,同时尊重括号
我有一个这样的列表:
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']
如果需要更复杂的分割,建议使用一个完整的解析器。