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

时间:2018-02-02 22:33:08

标签: regex openrefine google-refine grel

我正在尝试从openrefine中的文本列中提取电子邮件。有些单元格只有电子邮件,但其他单元格有john doe <john@doe.com>格式的名称和电子邮件。我一直在使用以下GREL /正则表达式,但它不会返回整个电子邮件地址。对于上述问题,我得到了["n@doe.com"]

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

捕获n因为您在捕获组之前使用.*,并且因为它可以匹配除了换行符之外的任何0+字符,所以可以在第1组中唯一可以登陆的字符回溯是@之前的字符。

如果你可以得到部分匹配,那就去掉.*并使用

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

请参阅regex demo

<强>详情

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

Python / Jython实现

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

还有其他方法可以匹配这些字符串。如果您需要一个完整的字符串匹配.*<([^<]+@[^>]+)>.*.*将不会丢弃该名称,因为它将在强制性<之前停止。

答案 1 :(得分:0)

如果某些单元格只包含电子邮件,则最好使用@ 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]

结果:

enter image description here

相关问题