gpt4 book ai didi

Python,正则表达式,提取大括号内的分组电子邮件

转载 作者:行者123 更新时间:2023-12-04 03:30:33 25 4
gpt4 key购买 nike

我正在尝试从字符串中提取多封电子邮件。我正在使用这个正则表达式:

re.findall(r'[\w\.-]+@[\w\.-]+(?:\.[\w]+)+', text)

它工作正常,但有时在文本中,具有相同域的电子邮件名称被分组在大括号中:

{annie,bonnie}@gmail.com

所以我的问题是如何正确解析它并将其提取为单独的电子邮件:
annie@gmail.com, bonnie@gmail.com?

我尝试修改正则表达式以考虑括号和逗号,然后使用简单的函数,但在那种情况下,我从字符串中得到了很多垃圾。

感谢任何帮助。

最佳答案

你可以使用

(?:{([^{}]*)}|\b\w[\w.-]*)(@[\w.-]+\.\w+)

参见 regex demo . 详细信息:

  • (?:{([^{}]*)}|\b\w[\w.-]*) - 非捕获组匹配:
  • {([^{}]*)} - {,然后第 1 组捕获 { 以外的任何零个或多个字符和 } 然后是 }
  • | - 或者
  • \b\w[\w.-]* - 一个单词边界(这将使匹配更有效),一个单词字符,然后是零个或多个单词、点或连字符
  • (@[\w.-]+\.\w+) - 第 2 组:a @,一个或多个单词、点或连字符,然后是. 和一个或多个单词字符。

查看 Python demo :

import re
text = "Emails like {annie,bonnie}@gmail.com, annie2@gmail.com, then a bonnie2@gmail.com."
emails = []
rx_email = re.compile( r'(?:{([^{}]*)}|\b\w[\w.-]*)(@[\w.-]+\.\w+)' )
for m in rx_email.finditer(text):
if m.group(1):
for email in m.group(1).split(','):
emails.append(f'{email}{m.group(2)}')
else:
emails.append(m.group())
print(emails)
# => ['annie@gmail.com', 'bonnie@gmail.com', 'annie2@gmail.com', 'bonnie2@gmail.com']

逻辑是

  • 获取 @ 前面带有 {...} 的电子邮件,同时将大括号内的内容捕获到第 1 组和 @... 进入第 2 组
  • 检查第 1 组是否匹配,如果匹配,则用逗号分隔内容,并通过将逗号分隔的用户名与域部分连接来构建结果匹配项
  • 如果第 1 组不匹配,则将匹配值附加到结果列表中。

关于Python,正则表达式,提取大括号内的分组电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66955030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com