Извлечение адресов электронной почты из беспорядочного текста в OpenRefine

Я пытаюсь извлечь только электронные письма из текстового столбца в openrefine. в некоторых ячейках указан только адрес электронной почты, а в других - имя и адрес электронной почты в формате john doe <[email protected]>. Я использовал следующее GREL / регулярное выражение, но он не возвращает весь адрес электронной почты. Для приведенного выше примера я получаю ["[email protected]"]

value.match(
/.*([a-zA-Z0-9_\-\+]+@[\._a-zA-Z0-9-]+).*/
)

Любая помощь горячо приветствуется.


person Abi Hassen    schedule 02.02.2018    source источник
comment
@ WiktorStribiżew Я рекомендую вам преобразовать ваш комментарий в ответ   -  person neontapir    schedule 03.02.2018
comment
import re \n return re.findall(r"([a-zA-Z0-9_\-\+]+@[\._a-zA-Z0-9-]+)", value)[0] - это то, что я успешно закончил. спасибо @Wiktor Stribiew и @Ettore Rizza   -  person Abi Hassen    schedule 03.02.2018


Ответы (2)


n захватывается, потому что вы используете .* перед группой захвата, и поскольку он может жадно соответствовать любым символам 0+, кроме символов разрыва строки, единственный символ, который может попасть в Группу 1 во время обратного отслеживания, - это символ прямо перед @.

Если вы можете получить частичные совпадения, избавьтесь от .* и используйте

/[^<\s]+@[^\s>]+/

См. демонстрацию регулярного выражения

Подробности

  • [^<\s]+ - 1 или более символов, кроме < и пробелов
  • @ - символ @
  • [^\s>]+ - 1 или более символов, кроме пробелов и >.

Реализация Python / Jython:

import re
res = ''
m = re.search(r'[^<\s]+@[^\s>]+', value)
if m:
    res = m.group(0)
return res

Есть и другие способы сопоставления этих строк. Если вам нужно полное совпадение строки, .*<([^<]+@[^>]+)>.*, где .* не поглотит имя, так как оно остановится перед обязательным <.

person Wiktor Stribiżew    schedule 02.02.2018
comment
Спасибо. К сожалению, это захватывает только электронные письма из ячеек, которые содержат только адрес электронной почты, он не возвращает ничего из текстовых ячеек, у которых есть имя или другой текст перед электронным письмом. Я думаю, это связано с реализацией регулярного выражения в GREL, потому что оба выражения отлично работают в javascript - person Abi Hassen; 03.02.2018

Если некоторые ячейки содержат только адрес электронной почты, вероятно, лучше использовать частичное совпадение @ wiktor-stribiżew. В разрабатываемой версии Open Refine теперь есть value.find() функция, которая может это делать, но официально она будет реализована только в следующей версии (2.9). А пока вы можете воспроизвести его с помощью Python / Jython вместо GREL:

import re
return re.findall(r"[^<\s]+@[^\s>]+", value)[0]

Результат :

введите описание изображения здесь

person Ettore Rizza    schedule 02.02.2018