Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3电子邮件提取搜索引擎_Python_Regex_List_Email_Search - Fatal编程技术网

Python3电子邮件提取搜索引擎

Python3电子邮件提取搜索引擎,python,regex,list,email,search,Python,Regex,List,Email,Search,编写一个搜索引擎,它将获取一个文件(比如html源页面)并提取所有电子邮件地址。然后它将在一个有序的列表中打印出来。该文件可能包含大量杂乱的文本(即asda@home无效..而且文件中可能有许多@的角色,而不是电子邮件!) 出于测试目的,这是我一直使用的文本文件: askdalsd asd sad asd asd asd ad asd asda da moi1990@gmail.com masda@sadas 223@home.ca 125512@12451.cpm domain@name.co

编写一个搜索引擎,它将获取一个文件(比如html源页面)并提取所有电子邮件地址。然后它将在一个有序的列表中打印出来。该文件可能包含大量杂乱的文本(即
asda@home
无效..而且文件中可能有许多@的角色,而不是电子邮件!)

出于测试目的,这是我一直使用的文本文件:

askdalsd
asd
sad
asd
asd
asd
ad
asd
asda
da
moi1990@gmail.com
masda@sadas
223@home.ca
125512@12451.cpm
domain@name.com
asda
sda
as
da
ketchup@ketchup@#%@#.com
onez!es@gomail.com
asdasda@@@@@email.com
asda@asdasdaad.ca
moee@gmail.com
这就是我到目前为止所做的:

import os
import re
import sys

def grab_email(file):
    email_pattern = re.compile(r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b',re.IGNORECASE)
    found = set()
    if os.path.isfile(file):
        for line in open(file, 'r'):
            found.update(email_pattern.findall(line))
        for email_address in found:
            print (email_address)
    if __name__ == '__main__':
        grab_email(sys.argv[1])


grab_email('email_addresses.txt')
现在我遇到的问题是,在某一点之后,程序崩溃了。这是输出:

125512@12451.cpm
es@gomail.com
asda@asdasdaad.ca
223@home.ca
moee@gmail.com
moi1990@gmail.com
domain@name.com
Traceback (most recent call last):
  File "D:/Sheridan/Part Time/TELE26529 Linux Architecture w. Network Scripting/Python Assignment 3.5/question1.py", line 17, in <module>
    grab_email('email_addresses.txt')
  File "D:/Sheridan/Part Time/TELE26529 Linux Architecture w. Network Scripting/Python Assignment 3.5/question1.py", line 14, in grab_email
    grab_email(sys.argv[1])
IndexError: list index out of range
125512@12451.cpm
es@gomail.com
asda@asdasdaad.ca
223@home.ca
moee@gmail.com
moi1990@gmail.com
domain@name.com
回溯(最近一次呼叫最后一次):
文件“D:/Sheridan/Part-Time/TELE26529 Linux架构w.Network Scripting/Python Assignment 3.5/question1.py”,第17行,在
抓取电子邮件(“email\u addresses.txt”)
文件“D:/Sheridan/Part-Time/TELE26529 Linux架构w.Network Scripting/Python Assignment 3.5/question1.py”,第14行,在grab_电子邮件中
抓取电子邮件(sys.argv[1])
索引器:列表索引超出范围

我做错了什么?我该如何解决?如何更有效地处理这些异常?

问题在于这一部分:

if __name__ == '__main__':
        grab_email(sys.argv[1])
您的程序正在崩溃,因为它正在
grab\u email
功能中处理此问题。由于您是从解释器运行的,
if
语句的计算结果当然是
True
。然后,由于没有传递任何命令行参数,因此尝试使用不存在的列表元素,从而导致出现错误

要修理,就去修理!它应该是这样的:

import os
import re
import sys

def grab_email(file):
    email_pattern = re.compile(r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b',re.IGNORECASE)
    found = set()
    if os.path.isfile(file):
        for line in open(file, 'r'):
            found.update(email_pattern.findall(line))
        for email_address in found:
            print (email_address)

if __name__ == '__main__':
    grab_email(sys.argv[1])
现在可以从命令行正确运行(假设从命令行正确传递文件名)。我还删除了无关的函数调用

当然,如果您只是想在解释器中运行它,请取出if语句并恢复我删除的函数调用。您也可以这样做:

if __name__ == '__main__':
    if len(sys.argv)>1:
        grab_email(sys.argv[1])
    else:
        grab_email('email_addresses.txt')

这本身不太好,但可以处理该特定错误(同时引入另一个潜在错误)。

您在命令行上传递的是什么?@squiguy我不是。我直接从脚本本身运行它。这有助于删除回溯错误,但它仍然没有读取文件的其余部分,我相信您已经知道了。如何让它读取整个文件并显示所有正确的结果?它将输出与正则表达式匹配的所有内容。或者是在你提供的例子中。您可以在输出中看到文件的最后一行,因此您知道它已被读取。您还需要修复数据结构的选择。集合没有排序,因此最终需要一个列表。我也会对它进行排序,这取决于您如何阅读这部分说明。如果我将输出附加到一个空列表中(该列表将首先在开始时声明),它会起作用吗?