正则表达式过滤查询| Google LogPuzzleExercise

时间:2017-12-13 17:08:18

标签: regex python-3.x

注意:我有一个关于regex如何适用于这种情况的查询。 尽管这与练习有关,但它不是作业帮助!因为我得到了我不提及的解决方案文件。

我正在进行log reading的练习。它基本上读取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

在line1中的某个地方被忽略了,我不知道怎么做。谁能解释一下我在做什么正则表达式错误?

1 个答案:

答案 0 :(得分:2)

\b转义字符与单词边界匹配,也就是说在没有前缀/后缀的另一个单词字符的单词字符之前和之后。由于第一个日志行的URI段以/结尾,不会被视为单词字符,因此它与模式word-break不匹配,然后是space,然后是HTTP