python - 使用正则表达式解析日志时不断收到 `NoneType` 错误

标签 python python-2.7 parsing logparser

我有一个示例,其中两个日志如下所示。我试图获取 ip、date_time、方法、这部分(/071300/242153 HTTP/1.1")、响应代码(只是 404/ 200 部分),其余的在一组:

66.249.69.97 - - [24/Sep/2014:22:25:44 +0000]“GET/071300/242153 HTTP/1.1”404 514“-”“Mozilla/5.0(兼容;Googlebot/2.1; +http://www.google.com/bot.html)"

71.19.157.174 - - [24/Sep/2014:22:26:12 +0000] "GET/error HTTP/1.1"404 505 "-""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36(KHTML,如 Gecko)Chrome/37.0.2062.94 Safari/537.36"

我的函数如下所示:

def parse_logs(logs):
  log_list = []
  for log in logs:
    p = re.compile(r'''(?P<ip_addr>\d+(\.\d+){3}) - - \[(?P<date_time>.+?)\] (?P<http_method>\".+?\") (?P<return_code>\d+) \d+ "-" (?P<client>\".+?\")''')

    m = p.search(log)

    log_list.append([m.group('ip_addr'), m.group('date_time'), m.group('http_method'), m.group('return_code'), m.group('client')])

rdd_prepped = parse_logs(rdd.take(5))

当我将这些日志的列表传递给该函数并运行它时,我不断收到错误: AttributeError:“NoneType”对象没有属性“collect”

当我在 m = p.search(log) 下放置 print(m.group('ip')) 行时,出现错误:

AttributeError:“NoneType”对象没有属性“group”

为什么我不断收到 NoneTypes?顺便说一句,我正在使用 Python2.7。

最佳答案

首次发布时,正则表达式如下所示:

p = re.compile(r'''(?P<ip>\d+(\.\d+){3}) - - \[(?P<date_time>.+?)\] (?P<method>\".+?\") \
    (?P<response_code>\d+) \d+ "-" (?P<client>\".+?\")''')

请注意第一行末尾的行继续符(“\”)。但该模式也是用三引号引起来的。因此该模式包含文本 '\\n '(斜杠 + 换行符 + 缩进)。结果,模式不匹配。

在一行上重写模式,它应该可以工作:

p = re.compile(r'''(?P<ip>\d+(\.\d+){3}) - - \[(?P<date_time>.+?)\] (?P<method>\".+?\") (?P<response_code>\d+) \d+ "-" (?P<client>\".+?\")''')

对于复杂的正则表达式,我喜欢使用详细模式:

regex = re.compile("""
    (?P<ip>\d+(?:\.\d+){3})     # four, dot-separated sets of digits
    .*?                         # skip ahead
    \[(?P<date_time>.*?)\]      # date time is everything between '[ ]'
    .*?                         # skip 
    "(?P<method>.*?)"           # method is everything between quotes
    .*?                         # skip 
    (?P<response_code>\d+)      # multiple digits
    .*?                         # skip
    "-"                         # don't care
    .*?                         #
    "(?P<client>.*?)"           # client is everything between quotes
    """, re.VERBOSE)

还有一些事情:

如果您希望正则表达式匹配(几乎)日志中的每一行,那么您应该打印/记录任何不匹配的行。这有助于捕获正则表达式中的错误,或者当有人在没有告诉您的情况下更改日志格式时。

将 re.compile 步骤移出循环。

MatchObject.group() 可以接受多个参数并返回列出的组的元组。

def parse_logs(logs):
  log_list = []

  p = re.compile(...whichever regex style you like...)

  for log in logs:

    m = p.search(log)

    if m:
      log_list.append(m.group('ip_addr', 'date_time', 'http_method, 
                              'return_code', 'client'))
    else:
        print(log)

rdd_prepped = parse_logs(rdd.take(5))

关于python - 使用正则表达式解析日志时不断收到 `NoneType` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666634/

相关文章:

python - 从 for 循环返回 false,否则在 F# 中继续

python - 将 python 列表子集化为正/负运动/趋势

parsing - ANTLR 在词法分析/解析中包含元数据的最佳方式(自定义对象、注释类型)

java - 我应该从哪里下载什么 jar 文件?

python - 如何使用 numpy.histogram 计算概率,然后用它来计算 KL 散度?

python - 为什么内置 sum 在 "from numpy import *"之后表现错误?

python - 使用应用于 groupby 的函数结果来计算原始 df

python - Django REST Framework 中的自定义列表权限

python-2.7 - python Psycopg删除不起作用

python - 我正在通过 python 中的解析器读取文件,但它不起作用