将用逗号或分号分隔的值字符串转换为Python列表

3

我正在从配置文件中读取电子邮件地址列表。这些地址可以用逗号或分号分隔 - 例如,

billg@microsoft.com,steve@apple.com, dhh@37signals.com
billg@microsoft.com;steve@apple.com;  dhh@37signals.com

我希望您能够去除电子邮件地址周围的任何空格。

我需要将它们放入Python列表中,如下所示:

['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']

什么是最符合Python风格的做法?谢谢。
7个回答

10

在这种情况下,我会使用re模块。

>>> import re
>>> 
>>> data = "billg@microsoft.com;steve@apple.com;  dhh@37signals.com"
>>> stuff = re.split(r"\s*[,;]\s*", data.strip())

使用 data.strip() 去除第一个字符前和最后一个字符后的空格。 - Fred Nurk
哎呀,忘了加 .strip() 了。谢谢! - Romuald Brunet

6

正则表达式非常强大,可能是这里的最佳选择;但对于这么简单的事情,字符串方法也可以。以下是一个简洁的解决方案:

[s.strip() for s in s1.replace(',', ';').split(';')]

测试输出:

>>> s1 = "billg@microsoft.com,steve@apple.com, dhh@37signals.com"
>>> s2 = "  billg@microsoft.com;steve@apple.com;  dhh@37signals.com  "
>>> print [s.strip() for s in s1.replace(',', ';').split(';')]
['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']
>>> print [s.strip() for s in s2.replace(',', ';').split(';')]
['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']

1
如果只有 ';' 或 ',',而且你知道是哪一个,可以使用 string.split:
>>> 'adjifjdasf;jdiafjodafs;jdiajof'.split(';')
['adjifjdasf', 'jdiafjodafs', 'jdiajof']

http://docs.python.org/library/stdtypes.html#str.split

编辑 对于空格,您也可以这样做:

>>> map(str.strip, 'adjifjdasf;jdiafjodafs ; jdiajof'.split(';'))
['adjifjdasf', 'jdiafjodafs', 'jdiajof']

1
还有空格的问题。 - chrisaycock
1
你可能忘记了,Ambrosio想要去掉前导和尾随的空格... - pierroz
1
不处理两种情况(即可以是逗号或分号分隔的情况)。 - martineau

1
你可以使用 string.maketrans 在一次操作中将多个分隔符替换为空格。
import string

data = "one  two,  three ; four "
stuff = [i for i in data.translate(string.maketrans(";,", "  ")).split()]

print stuff   # -> ['one', 'two', 'three', 'four']

1

你可以只使用Python的字符串操作功能来完成它:

import string

s1 = "billg@microsoft.com,steve@apple.com, dhh@37signals.com"
s2 = "billg@microsoft.com;steve@apple.com;  dhh@37signals.com"

print s1.translate(string.maketrans(';',','), string.whitespace).split(',')
# ['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']
print s2.translate(string.maketrans(';',','), string.whitespace).split(',')
# ['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']

0
data = '''   billg@microsoft.com,steve@apple.com, dhh@37signals.com  
  billg@microsoft.com;steve@apple.com;\t  \rdhh@37signals.com       '''

print repr(data),'\n'

import re

print re.findall('[^,\s;]+', data)

结果

'   billg@microsoft.com,steve@apple.com, dhh@37signals.com  \n  billg@microsoft.com;steve@apple.com;\t  \rdhh@37signals.com       ' 

['billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com', 'billg@microsoft.com', 'steve@apple.com', 'dhh@37signals.com']

注意这个数据中的 '\n','\t'和'\r'


-1


def gen_list(file_path):
    read= open(file_path, "r")
    split1= read.split(";")
    new_list= []
    for i in split1:
       split2 = i.split(",")
       split_list = [item.strip() for item in split2 if "@" in item]
       new_list.extend(split_list)
       return new_list

# 这适用于逗号和分号。行数还可以进一步减少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接