Я хочу разбить строку, чтобы получить электронное письмо -
как разделитель, но как адрес электронной почты, так и имя содержит -
как я могу исключить -
по электронной почте и имени?
Ниже приведен образец данных, первая строка хороша; вторая строка, mrs.jay-zee
- это имя, [email protected]
- это электронное письмо; третья строка, mary-alice
- это имя, [email protected]
- это электронное письмо.
contact=['[email protected]','[email protected]','[email protected]']
df=pd.DataFrame(contact,columns=['contacts'])
если я использую следующую лямбда-функцию, я получаю неправильный ответ. Каким образом можно достичь моей цели?
df['contacts'].apply(lambda x: x.split('-')[1])
вместо того, чтобы расщепляться и пытаться объединиться, почему бы не заменить терминал -
& цифры с ''
df.contacts.str.replace('-\d+$', '')
outputs:
0 [email protected]
1 [email protected]
2 [email protected]
к сожалению, как может быть -
как в электронной почте, так и в имени, невозможно определить, где заканчивается имя, и где начинается электронная почта, просто просмотрев строку.
Я имею в виду, что можно предположить, что человека называют mary alice ma
имеющего электронное письмо [email protected]
а не mary alice
имеющее адрес электронной почты [email protected]
Ваш лучший выбор для лечения контактов с 2 или более -
символами перед @
вручную. Но для записей с только 1 -
можно с уверенностью предположить, что - -
отделяет имя от адреса электронной почты, а имена/электронные письма могут быть извлечены для этих записей только с использованием:
df['name_email'] = df.contacts.str.replace('-\d+$', '')
df['ambiguous'] = df.name_email.apply(lambda x: len(re.findall('-', x)) > 1)
df[['name', 'email']] = df.apply(
lambda x: pd.Series([None, None]) if x.ambiguous else pd.Series(x.name_email.split('-')),
axis=1
)
Затем для результирующего кадра данных напишите более конкретный код для обработки случаев с несколькими -
.
Вы можете использовать регулярное выражение для этого:
import re
VALID_EMAIL_REGEX = '\w+[-\w]+@\w+[\.\w]+'
emailaddr = lambda x: re.compile(VALID_EMAIL_REGEX).search(x).group(0)
df['contacts'].apply(emailaddr)
Будет работать в любой форме комбинации -
и [a-zA-Z]
слева от @
и только в любой комбинации .
и [a-zA-Z]
, чтобы слева от -
а справа от @
.