Python 如何从文本文件中提取特定电子邮件

Python 如何从文本文件中提取特定电子邮件,python,python-3.x,email,text,extract,Python,Python 3.x,Email,Text,Extract,python新手,坚持这一点 我有一个很大的文本文件,只包含来自不同领域的电子邮件。说我只想拿出gmail和hotmail 我能理解这一点,但结果是混合在一起 filename = input('Enter filename to open: ') try: filename = open(filename) except: print('File cannot be opened: ', filename) exit() import re for line in filena

python新手,坚持这一点

我有一个很大的文本文件,只包含来自不同领域的电子邮件。说我只想拿出gmail和hotmail

我能理解这一点,但结果是混合在一起

filename = input('Enter filename to open: ')
try:
    filename = open(filename)
except:
    print('File cannot be opened: ', filename)
exit()
import re
for line in filename:
    line = line.rstrip()
    x = re.findall('\S+@gmail.com',  line)
    if len(x) > 0:
        print(x)
    y = re.findall('\S+@hotmail.com',  line)
    if len(y) > 0:
        print(y)

我的目标是让它打印出所有的gmail电子邮件,然后列出它找到的gmail电子邮件地址的数量。然后,我希望它列出所有的hotmail帐户,并列出它找到了多少hotmail帐户。有道理吗

@JAW是绝对正确的,因为您正在逐行搜索它。由于您使用的是
re.findall
,因此没有理由需要遍历这些行。你所要做的就是:

import re

filename = input('Enter filename to open: ')

try:
    file = open(filename)
except:
    print('File cannot be opened: ', filename)
    exit()

emails = file.read()
x = re.findall('\S+@gmail.com',  emails)
if len(x) > 0:
    print(x)
    # or print("\n".join(x)) for list-like printing 

y = re.findall('\S+@hotmail.com',  emails)
if len(y) > 0:
    print(y)
    # or print("\n".join(y)) for list-like printing

不要打印找到的地址,而是将它们收集到两个列表中,并在末尾打印列表:

gmail = []
hotmail = []

for line in filename: #filename is a BAD name for this variable
    address = re.findall('\S+@gmail.com', line)
    if address: gmail.extend(address)
    address = re.findall('\S+@hotmail.com', line)
    if address: hotmail.extend(address)

print(gmail)
print(hotmail)

我想这是因为你在逐行搜索。这意味着它将在行中打印gmail地址,然后在行中打印hotmail地址,然后转到下一行。而不是打印文件中的所有gmail地址,然后打印文件中的所有hotmail地址。除非这是你想做的。考虑使用模块<代码>邮箱< /COD>(),而不是自己弄乱邮件。我该怎么做呢?我看到的文本文件通常只是电子邮件,有时包含密码。我需要找出那些有特定电子邮件的邮件,然后再找出那条线上的其他邮件。为了让你的工作变得简单和容易,你可以使用分组<代码>重新编译('(\S+@gmail.com)*(\w+)