Строка значений, разделенных запятыми или точками с запятой в списке Python - PullRequest
3 голосов
/ 31 января 2011

Я читаю список адресов электронной почты из файла конфигурации. Адреса могут быть разделены запятой или точкой с запятой - например,

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

Какой самый Pythonic способ сделать это? Спасибо.

Ответы [ 7 ]

10 голосов
/ 31 января 2011

В этом случае я бы использовал модуль re

>>> import re
>>> 
>>> data = "billg@microsoft.com;steve@apple.com;  dhh@37signals.com"
>>> stuff = re.split(r"\s*[,;]\s*", data.strip())
6 голосов
/ 31 января 2011

Регулярные выражения являются мощными, и, вероятно, путь сюда; но для чего-то такого простого, строковые методы тоже подойдут. Вот краткое решение:

[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 голос
/ 31 января 2011

Вы можете сделать это, используя только возможности 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']
1 голос
/ 31 января 2011

Вы можете использовать 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 голос
/ 31 января 2011

Если это только ';' или только ',' и вы знаете, какой, используйте 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']
0 голосов
/ 01 февраля 2011
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' в этих данных

0 голосов
/ 31 января 2011

<code>
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</p>

<p>
# Работает как с запятой, так и с;Количество строк может быть дополнительно уменьшено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...