Как разделить список с «-» в качестве разделителя, при этом строка содержит «-»?

1

Я хочу разбить строку, чтобы получить электронное письмо - как разделитель, но как адрес электронной почты, так и имя содержит - как я могу исключить - по электронной почте и имени?

Ниже приведен образец данных, первая строка хороша; вторая строка, 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])
Теги:
split

2 ответа

0
Лучший ответ

вместо того, чтобы расщепляться и пытаться объединиться, почему бы не заменить терминал - & цифры с ''

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
)

Затем для результирующего кадра данных напишите более конкретный код для обработки случаев с несколькими -.

  • 0
    Спасибо. Вы правы по поводу невозможности определить имя и адрес электронной почты. Я мог определить образец, потому что я знаю адрес электронной почты и имя. Это хорошая мысль, чтобы отделиться от пространства.
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], чтобы слева от - а справа от @.

  • 0
    Большое спасибо! Я изучал Regex в течение последних 30 минут :)
  • 0
    это то, что я получил, это не совсем то, что я ищу. 0 [email protected] 1 [email protected] 2 [email protected]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню