在 OpenRefine 中从杂乱的文本中提取电子邮件地址

Extracting email addresses from messy text in OpenRefine

我正试图从 openrefine 的文本列中提取电子邮件。有些单元格只有电子邮件,但其他单元格有 john doe <john@doe.com> 格式的姓名和电子邮件。我一直在使用以下 GREL/regex 但它不是 return 整个电子邮件地址。对于上面的例子,我得到 ["n@doe.com"]

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

非常感谢任何帮助。

n 被捕获是因为您在捕获组之前使用 .* ,并且因为它可以匹配除换行符以外的任何 0+ 个字符贪婪地是唯一可以落在组中的字符回溯期间的 1 是 @.

之前的字符

如果你可以获得部分匹配 git 去掉 .* 并使用

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

regex demo

详情

  • [^<\s]+ - 除了 < 和空格
  • 之外的 1 个或更多字符
  • @ - 一个 @ 字符
  • [^\s>]+ - 除了空格和 >.
  • 之外的 1 个或更多字符

Python/Jython实施:

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

还有其他方法可以匹配这些字符串。如果您需要完整的字符串匹配 .*<([^<]+@[^>]+)>.*,其中 .* 不会吞噬名称,因为它会在强制性 <.

之前停止

如果某些单元格只包含电子邮件,最好使用@wiktor-stribiżew 的部分匹配。在Open Refine的开发版本中,there is now a value.find() function that can do this,但要到下个版本(2.9)才会正式实现。同时,您可以使用 Python/Jython 而不是 GREL 来重现它:

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

结果: