簡體   English   中英

Python,正則表達式,提取大括號內的分組電子郵件

[英]Python, Regex, extract grouped emails within curly brackets

我正在嘗試從字符串中提取多封電子郵件。 我正在使用這個正則表達式:

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

它工作正常,但有時在文本中 Email 具有相同域的名稱分組在大括號中:

{annie,bonnie}@gmail.com

所以我的問題是如何正確解析它並提取為單獨的電子郵件:
annie@gmail.com, bonnie@gmail.com

我嘗試修改正則表達式以考慮括號和逗號,然后使用簡單的 function,但在這種情況下,我從字符串中得到了很多垃圾。

任何幫助表示贊賞。

您可以使用

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

請參閱正則表達式演示 詳情

  • (?:{([^{}]*)}|\b\w[\w.-]*) - 非捕獲組匹配:
  • {([^{}]*)} - 一個{ ,然后第 1 組捕獲除{}之外的任何零個或多個字符,然后是一個}
  • | - 或者
  • \b\w[\w.-]* - 一個單詞邊界(它將使匹配更有效),一個單詞字符,然后是零個或多個單詞、點或連字符字符
  • (@[\w.-]+\.\w+) - 第 2 組:一個@ ,一個或多個單詞、點或連字符,然后是. 和一個或多個單詞字符。

請參閱Python 演示

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 組不匹配,則僅 append 將匹配值添加到結果列表中。

您可以將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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM