在 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>]+/
详情
[^<\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]
结果:
我正试图从 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>]+/
详情
[^<\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]
结果: