“非类型”对象没有属性“组”错误。Python代码

2024-09-28 22:26:54 发布

您现在位置:Python中文网/ 问答频道 /正文

import os
import re 
from collections import Counter
fileNames = []
textInfo = []

currentDirectoryPath = os.getcwd()
print(currentDirectoryPath)


regexp = re.compile(
    r'(?P<clientIP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+\['
    + '(?P<timestamp>\d{2}/[A-Z][a-z]{2}/\d\d\d\d).+\"'
    + '(?P<action>[A-Z]{3,4}).+\"'  
    + '(?P<statuscode>[1-5][0-9][0-9])'
    )

#(?P<clientIP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+\[(?P<timestamp>\d{2}/[A-Z][a-z]{2}/\d\d\d\d).+\"(?P<action>[A-Z]{3,4}).+\" (?P<statuscode>[1-5][0-9][0-9])


os.chdir("/content/drive/log")
currentDirectoryPath = os.getcwd()
listOfFileNames = os.listdir(currentDirectoryPath)
#for files in listOfFileNames :
    #print(files) 


f = open('access_1.log', 'r')
matched = 0
failed = 0
cnt_clientIPs = Counter()


for line in f:
    m = re.match(regexp, line)
    if m:
        cnt_clientIPs.update([m.group('clientIP')])
        matched += 1
    else:
        failed += 1

    print("""
    client.........: %s
    timestamp......: %s
    actions........: %s
    statuscode.....: %s
    """ %
      (m.group('clientIP'),
      m.group("timestamp"),
      m.group("action"),
      m.group("statuscode"),
    ))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-bc8f84e43987> in <module>()
     46     statuscode.....: %s
     47     """ %
---> 48       (m.group('clientIP'),
     49       m.group("timestamp"),
     50       m.group("action"),

AttributeError: 'NoneType' object has no attribute 'group'

我在最后一个print语句中一直没有得到属性错误。我的正则表达式可以运行,但当我无法打印它时。如果我从正则表达式中取出状态代码,就可以打印它。我不知道为什么我总是得到一个无属性错误,当它有属性。 下面是一行测试代码来帮助您运行它。我本想从一个文件中获取它,但我无法在这里上传该文件。 “109.169.248.247---[12/Dec/2015:18:25:11+0100]“GET/administrator/HTTP/1.1”200 4263“-”Mozilla/5.0(Windows NT 6.0;rv:34.0)Gecko/20100101 Firefox/34.0“-”


Tags: inimportre属性oscountergroupaction
2条回答

尝试:

...

for line in f:
    m = re.match(regexp, line)
    if m:
        cnt_clientIPs.update([m.group('clientIP')])
        matched += 1
    else:
        failed += 1
        continue
...

您的正则表达式不允许在示例数据中存在的状态代码之前留有空格

另外,请注意,如果将字符串括在单引号中,则不需要转义双引号"。如果使用\"对它们进行转义,并使用原始字符串,则会引入一个普通的反斜杠

我使用的正则表达式是:

regexp = re.compile(
    r'(?P<clientIP>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+\['
    + r'(?P<timestamp>\d{2}/[A-Z][a-z]{2}/\d\d\d\d).+"'
    + r'(?P<action>[A-Z]{3,4}).+"'  
    + r'\s*(?P<statuscode>[1-5][0-9][0-9])'
    )

相关问题 更多 >