Python、正则表达式、在花括号内提取分组电子邮件

2024-04-27 12:59:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

{annie,bonnie}@gmail.com

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

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

谢谢你的帮助


Tags: 函数字符串text文本re名称com电子邮件
3条回答

你可以用

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

regex demo详细信息

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

见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不匹配,只需将匹配值附加到结果列表中

您可以将re.findall与列表一起使用:

inp = "{annie,bonnie}@gmail.com"
parts = re.findall(r'\{(.*?)\}(@\S+)\b', inp)[0]
emails = [email + parts[1] for email in parts[0].split(',')]
print(emails)

这张照片是:

['annie@gmail.com', 'bonnie@gmail.com']
x = 'xy2@gmail.com data@gmail.com google@gmail.com {annie,bonnie}@gmail.com'
q = []
for i,j in enumerate(x):
    if '{' == j or '}' ==j :
        q.append(i)  
    
y1 = x[q[0]+1:q[1]]
a1 = y1.replace(','," ")
a1 = a1.split(" ")
z = [i+'@gmail.com' for i in a1]

x = x.replace("{",'')
y = x.replace("}",'')
z1 = " ".join(z)
z2 = y.replace(y1,z1

相关问题 更多 >