[英]Capturing emails with regex in Python
我將從一個更大的CSV文件中收集分散的電子郵件。 我現在正在學習正則表達式。 我正在嘗試從此例句中提取電子郵件。 但是,電子郵件中僅包含@符號和緊接其前的字母。 您能幫我看看發生了什么事嗎?
import re
String = "'Jessica's email is jessica@gmail.com, and Daniel's email is daniel123@gmail.com. Edward's is edwardfountain@gmail.com, and his grandfather, Oscar's, is odawg@gmail.com.'"
emails = re.findall(r'.[@]', String)
names = re.findall(r'[A-Z][a-z]*',String)
print(emails)
print(names)
您的正則表達式電子郵件根本無法工作: emails = re.findall(r'.[@]', String)
匹配anychar,然后匹配@
。
我會嘗試另一種方法:匹配句子並提取名稱,給電子郵件加上以下經驗性假設(如果您的文本變化太大,將破壞邏輯)
's"
並且is
某處(使用非貪婪的.*?
來匹配兩者之間的所有內容 \\w
匹配任何字母數字字符(或下划線),並且域僅一個點(否則它與句子的最后一個點匹配) 碼:
import re
String = "'Jessica's email is jessica@gmail.com, and Daniel's email is daniel123@gmail.com. Edward's is edwardfountain@gmail.com, and his grandfather, Oscar's, is odawg@gmail.com.'"
print(re.findall("(\w+)'s.*? is (\w+@\w+\.\w+)",String))
結果:
[('Jessica', 'jessica@gmail.com'), ('Daniel', 'daniel123@gmail.com'), ('Edward', 'edwardfountain@gmail.com'), ('Oscar', 'odawg@gmail.com')]
轉換為dict
甚至可以給您一個字典名稱=>地址:
{'Oscar': 'odawg@gmail.com', 'Jessica': 'jessica@gmail.com', 'Daniel': 'daniel123@gmail.com', 'Edward': 'edwardfountain@gmail.com'}
一般情況下需要更多字符(不確定我是否詳盡):
String = "'Jessica's email is jessica_123@gmail.com, and Daniel's email is daniel-123@gmail.com. Edward's is edward.fountain@gmail.com, and his grandfather, Oscar's, is odawg@gmail.com.'"
print(re.findall("(\w+)'s.*? is ([\w\-.]+@[\w\-.]+\.[\w\-]+)",String))
結果:
[('Jessica', 'jessica_123@gmail.com'), ('Daniel', 'daniel-123@gmail.com'), ('Edward', 'edward.fountain@gmail.com'), ('Oscar', 'odawg@gmail.com')]
1. 電子郵件
In [1382]: re.findall(r'\S+@\w+\.\w+', text)
Out[1382]:
['jessica@gmail.com',
'daniel123@gmail.com',
'edwardfountain@gmail.com',
'odawg@gmail.com']
工作原理:所有電子郵件均為xxx@xxx.xxx
。 要注意的一件事是@
周圍的一串字符和單數.
。 因此,我們使用\\S
划定不是空格的任何內容。 +
是搜索1個或多個這樣的字符。 \\w+\\.\\w+
只是說說搜索只有一個字符串的一種奇特的方式.
在里面。
2. 名稱
In [1375]: re.findall('[A-Z][\S]+(?=\')', text)
Out[1375]: ['Jessica', 'Daniel', 'Edward', 'Oscar']
工作原理:任何以大寫字母開頭的單詞。 (?=\\')
是超前的。 如您所見,所有名稱都遵循Name's
模式。 我們想要撇號之前的所有內容。 因此,前瞻未捕獲。
現在,如果您想通過將名稱與一個大型正則表達式一起捕獲來將名稱映射到電子郵件,則可以。 Jean-FrançoisFabre的答案是一個好的開始。 但我建議先降低基礎知識。
您需要找到錨點,樣式來匹配。 改進的模式可以是:
import re
String = "'Jessica's email is jessica@gmail.com, and Daniel's email is
daniel123@gmail.com. Edward's is edwardfountain@gmail.com, and his
grandfather, Oscar's, is odawg@gmail.com.'"
emails = re.findall(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', String)
names = re.findall(r'[A-Z][a-z]*', String)
print(emails)
print(names)
\\ w +缺少電子郵件地址中允許的'-'。
這是因為您沒有使用重復運算符。 下面的代碼使用+運算符,這意味着字符/子模式正好可以重復1到很多次。
s = '''Jessica's email is jessica@gmail.com, and Daniel's email is daniel123@gmail.com. Edward's is edwardfountain@gmail.com, and his grandfather, Oscar's, is odawg@gmail.com.'''
p = r'[a-z0-9]+@[a-z]+\.[a-z]+'
ans = re.findall(p, s)
print(ans)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.