Python – Regex – найти все дубликаты

Я пытаюсь сопоставить электронные письма в тексте html, используя следующий код в python

my_second_pat = '((\w+)( *?))(@|[aA][tT]|\([aA][tT]\))(((( *?)(\w+)( *?))(\.|[dD][oO][tT]|\([dD][oO][tT]\)))+)([eE][dD][uU]|[cC][oO][mM])'


matches = re.findall(my_second_pat,line)
for m in matches:
    s = "".join(m)
    email = "".join(s.split())
    res.append((name,'e',email))

когда я запускаю его на line = [email protected]

Я получил:

[('shoham', 'shoham', '', '@', 'stanford.', 'stanford.', 'stanford', '', 'stanford', '', '.', 'edu')]

что я ожидаю:

[('shoham','@', 'stanford.', 'edu')]

На regexpal.com он соответствует одной строке, так что, думаю, у меня проблемы с re.findall.

Я новичок как в регулярном выражении, так и в python. Любая оптимизация/модификация приветствуется.


person yhammad    schedule 10.03.2014    source источник


Ответы (2)


Попробуй это:

(?i)([^@\s]{2,})(?:@|\s*at\s*)([^@\s.]{2,})(?:\.|\s*dot\s*)([^@\s.]{2,})

Визуализация регулярных выражений

Демонстрация отладки

Если вам нужно ограничиться .com и .edu:

(?i)([^@\s]{2,})(?:@|\s*at\s*)([^@\s.]{2,})(?:\.|\s*dot\s*)(com|edu)

Визуализация регулярных выражений

Демонстрация отладки

Обратите внимание, что я использовал флаг без учета регистра (?i) в начале регулярного выражения вместо использования синтаксиса, подобного [Ee].

person elixenide    schedule 10.03.2014
comment
Рад помочь! Пожалуйста, не забудьте выбрать ответ! :) - person elixenide; 11.03.2014

Он соответствует всем вашим группам захвата, которые содержат необязательные совпадения.


Попробуй это:

((?:(?:\w+)(?: *?))(?:@|[aA][tT]|\(?:[aA][tT]\))(?:(?:(?:(?: *?)(?:\w+)(?: *?))(?:\.|[dD][oO][tT]|\(?:[dD][oO][tT]\)))+)(?:[eE][dD][uU]|[cC][oO][mM]))

См. эту ссылку для отладки вашего выражения:

http://regex101.com/r/jW4mP1

person Vasili Syrakis    schedule 10.03.2014