Функция, которая возвращает адреса электронной почты из списка строк в Python - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно создать функцию, которая возвращает адреса электронной почты из списка строк. Я сделал это успешно с помощью следующего кода:

def myfunction(bigstring):
    str = ' '.join(bigstring)
    my_string = str
    str1 = re.findall(r'[\w\.-]+@[\w\.-]+', my_string)
    return str1

Однако, когда я запускаю следующий пример:

emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']
myfunction(emails)

, я получаю вывод:

['jk123@gmail.com', 'johnk123@hotmail.com', 'ah123@yahoo.com', 'benji@live.co.uk']

Однако я хотел бы получить следующий вывод, но я не уверен, как это сделать, не испортив мой код:

[['jk123@gmail.com', johnk123@hotmail.com'], ['ah123@yahoo.com'], ['benji@live.co.uk']]

Мне нужно вернуть список в списке, как показано желаемым выводом.

Ответы [ 5 ]

2 голосов
/ 07 ноября 2019

Вам не нужно присоединяться к исходному массиву сообщений электронной почты, содержащему строки.

def my_function(str_array):
    return [re.findall(r'[\w\.-]+@[\w\.-]+', s) for s in str_array]

emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']

my_function(emails)
1 голос
/ 07 ноября 2019
def myfunction(bigstring):
    #str = ' '.join(bigstring)
    #my_string = str
    str1 = re.findall(r'[\w\.-]+@[\w\.-]+', bigstring)
    return str1

import re
output=[]
emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']
for item in emails:
    output.append(myfunction(item))

print(output)
1 голос
/ 07 ноября 2019

Не объединяйте всю строку в функции и передавайте строку одну за другой итерацией, подобной этой

import re
def myfunction(bigstring):
    return  re.findall(r'[\w\.-]+@[\w\.-]+', bigstring)

emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']


output = []
for emailstring in emails:
    output.append((myfunction(emailstring)))
print(output)

, используя понимание списка

output = [ myfunction(email) for email in emails ]
print(output)

, используя карта

print(map(myfunction,emails))

Выход

[['jk123@gmail.com', 'johnk123@hotmail.com'], ['ah123@yahoo.com'], ['benji@live.co.uk']]
1 голос
/ 07 ноября 2019

Извлечение писем в каждом элементе списка:

import re

emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']
def myfunction(bigstring):
    result = []
    for s in bigstring:
        result.append(re.findall(r'[\w.-]+@[\w.-]+', s))
    return result

print(myfunction(emails))
# => [['jk123@gmail.com', 'johnk123@hotmail.com'], ['ah123@yahoo.com'], ['benji@live.co.uk']]

См. Демо Python .

На самом деле, bigstring - это плохое имя здесь, так каксписок. Попробуйте переименовать, скажем, в my_list или что-то в этом роде.

Что касается регулярного выражения, вам не нужно экранировать точки внутри классов символов.

0 голосов
/ 15 ноября 2019
    def myfunction(bstr):
        #str = ' '.join(bstr)
        #my_string = str
        str1 = re.findall(r'[\w\.-]+@[\w\.-]+', bstr)
        return str1
    import re
    output=[]
    emails = ['John Kennedy <jk123@gmail.com> or <johnk123@hotmail.com>','Adam 
              Hartley <ah123@yahoo.com>','Ben Saunders <benji@live.co.uk>']
     for item in emails:
        output.append(myfunction(item))

     print(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...