Regex 正则表达式过滤器查询|谷歌日志

Regex 正则表达式过滤器查询|谷歌日志,regex,python-3.x,Regex,Python 3.x,注意:我有一个关于regex如何处理这种情况的问题。即使这是一个练习,它不是一个家庭作业的帮助!因为我得到了我没有提到的解决方案文件 我正在做这个练习。它基本上是读取Apache日志并下载其中记录的图像文件 第1行: 10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv

注意:我有一个关于regex如何处理这种情况的问题。即使这是一个练习,它不是一个家庭作业的帮助!因为我得到了我没有提到的解决方案文件

我正在做这个练习。它基本上是读取Apache日志并下载其中记录的图像文件

第1行:

10.254.254.28 - - [06/Aug/2007:00:12:20 -0700] "GET /keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"
第2行:

10.254.254.58 - - [06/Aug/2007:00:10:05 -0700] "GET /edu/languages/google-python-class/images/puzzle/a-baaa.jpg HTTP/1.0" 200 2309 "-" "googlebot-mscrawl-moma (enterprise; bar-XYZ; foo123@google.com,foo123@google.com,foo123@google.com,foo123@google.com)"
首先我写了一个正则表达式来简单地识别所有的get


把弦的部分给我

pattern = r"GET\s(.+)\b\s"
match_list = re.findall(pattern, log)
if match_list:
    print(match_list[0])
这张照片

/keyser/22300/ HTTP/1.0" 302 528 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515
当我将模式调整为
pattern=r“GET\s(+)\b\sHTTP
时,它现在可以打印了

/edu/languages/google-python-class/images/puzzle/a-baaa.jpg

第1行中的何处被忽略了,我不知道怎么做。有人能解释一下我在做什么regex错误吗?

转义字符与单词边界匹配,也就是说,在单词字符之前和之后没有另一个单词字符作为前缀/后缀。因为第一个日志行的URI段以
结尾/
,它不被认为是一个单词字符,它与模式不匹配
分词
然后
空格
然后
HTTP

如果你将
\b
的反斜杠转义为
GET\s(+)\\b\sHTTP
,它会像你期望的那样工作吗?我会尝试一下,但我把字符串标记为raw r““所以觉得它不是必需的,正如Q中提到的,使用HTTP我得到了第二行,但是为什么第一行没有被搜索呢?因为字符串是原始的r”“额外的\不起作用啊,你是对的,我对python不太熟悉,所以只是猜测而已。”。查看文件中的两行,这是因为路径的最后一个字符不是单词字符,这意味着
/HTTP
\b\sHTTP
不匹配。