Coursera课程-Python作业1中的数据科学介绍

Coursera课程-Python作业1中的数据科学介绍,python,regex,Python,Regex,我正在Coursera上这门课,在做第一个作业的时候,我正在处理一些问题。任务基本上是使用正则表达式从给定文件中获取某些值。然后,函数应输出包含以下值的字典: example_dict = {"host":"146.204.224.152", "user_name":"feest6811", "time":"21/J

我正在Coursera上这门课,在做第一个作业的时候,我正在处理一些问题。任务基本上是使用正则表达式从给定文件中获取某些值。然后,函数应输出包含以下值的字典:

example_dict = {"host":"146.204.224.152", 

                "user_name":"feest6811", 

                "time":"21/Jun/2019:15:45:24 -0700",

                "request":"POST /incentivize HTTP/1.1"} 
这只是该文件的屏幕截图。由于某些原因,如果不直接从Coursera打开链接,该链接将无法工作。我为格式错误提前道歉。我必须指出的一点是,在某些情况下,正如您在第一个示例中看到的,没有用户名。而是使用“-”

159.253.153.40 - - [21/Jun/2019:15:46:10 -0700] "POST /e-business HTTP/1.0" 504 19845
136.195.158.6 - feeney9464 [21/Jun/2019:15:46:11 -0700] "HEAD /open-source/markets HTTP/2.0" 204 21149 
这就是我现在拥有的。但是,输出为无。我想我的模式有问题

import re
def logs():
    
    with open("assets/logdata.txt", "r") as file:
        logdata = file.read()
    # YOUR CODE HERE
        
        pattern = """ 
        (?P<host>\w*)
        (\d+\.\d+.\d+.\d+\ )
        (?P<user_name>\w*)
        (\ -\ [a-z]+[0-9]+\ )
        (?P<time>\w*)
        (\[(.*?)\])
        (?P<request>\w*)
        (".*")
        """
        for item in re.finditer(pattern,logdata,re.VERBOSE):
       
            print(item.groupdict())
重新导入
def日志():
打开(“assets/logdata.txt”、“r”)作为文件:
logdata=file.read()
#你的代码在这里
pattern=”“”
(?P\w*)
(\d+\.\d+.\d+.\d+\)
(?P\w*)
(\-\[a-z]+[0-9]+\)
(?P\w*)
(\[(.*?)\])
(?P\w*)
(".*")
"""
对于re.finditer中的项(模式、日志数据、re.VERBOSE):
打印(item.groupdict())

您可以使用以下表达式:

(?P\d+(?:\.\d+{3})#1个以上数字和3个发生率。和3个数字
\s+\s+\s+#1+空格、1+非空格、1+空格
(?P\S+\S+\[\35; 1+非空白(组“用户名”)、1+空白和[
(?P[^\]\[]*)\]\s+#组“时间”:0+除[和],]以外的字符,1+空格
(?P[^“]*)“#”,组“请求”:0+非-chars
看。 见:

重新导入
logdata=r“159.253.153.40---[21/Jun/2019:15:46:10-0700]“POST/e-business HTTP/1.0”504 19845
136.195.158.6-feeney9464[21/Jun/2019:15:46:11-0700]“HEAD/open-source/markets HTTP/2.0”204 21149“
模式=r''
(?P\d+(?:\.\d+{3})#1+个数字和3个发生率。和3个数字
\s+\s+\s+#1+空格、1+非空格、1+空格
(?P\S+\S+\[\35; 1+非空白(组“用户名”)、1+空白和[
(?P[^\]\[]*)\]\s+#组“时间”:0+除[和],]以外的字符,1+空格
(?P[^“]*)“#”,组“请求”:0+非-chars
'''
对于re.finditer中的项(模式、日志数据、re.VERBOSE):
打印(item.groupdict())
输出:

{'host':'159.253.153.40','user_name':'-','time':'21/Jun/2019:15:46:10-0700','request':'POST/e-business HTTP/1.0'}
{'host':'136.195.158.6','user_name':'feeney9464','time':'21/Jun/2019:15:46:11-0700','request':'HEAD/open-source/markets HTTP/2.0'}
使用以下代码进行检查:

assert len(names()) == 4, "There are four names in the simple_string"

有关regex的更多信息,请阅读以下文档,这对初学者非常有用:

非常感谢!!!成功了!!!然而,我可以问一个关于你的解决方案的问题吗?这听起来可能很愚蠢,但是你不需要把所有的东西都放在括号里吗?例如,(“?P[^”]*”),或者它们是相同的吗?另外,请您解释一下您的定期报告中“?:”的含义expression@BryantHsiung不能使用
(“?P[^”]*”
,它是无效的正则表达式构造。了解更多信息。刚刚做了!再次感谢!所有调试细节都在问题中,问题就在主题上。刚刚修正了格式。
assert len(names()) == 4, "There are four names in the simple_string"