我正在尝试从openrefine中的文本列中提取电子邮件。有些单元格只有电子邮件,但其他单元格有john doe <john@doe.com>
格式的名称和电子邮件。我一直在使用以下GREL /正则表达式,但它不会返回整个电子邮件地址。对于上述问题,我得到了["n@doe.com"]
value.match(
/.*([a-zA-Z0-9_\-\+]+@[\._a-zA-Z0-9-]+).*/
)
非常感谢任何帮助。
答案 0 :(得分:0)
捕获n
因为您在捕获组之前使用.*
,并且因为它可以匹配除了换行符之外的任何0+字符,所以可以在第1组中唯一可以登陆的字符回溯是@
之前的字符。
如果你可以得到部分匹配,那就去掉.*
并使用
/[^<\s]+@[^\s>]+/
请参阅regex demo
<强>详情
[^<\s]+
- 除<
和空格@
- @
字符[^\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]
结果: