NoneType 'объект не имеет атрибута' group 'ошибка. Python код - PullRequest
1 голос
/ 29 апреля 2020
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'

Я не получаю ошибку атрибута в последнем операторе печати. Мое регулярное выражение может работать, но когда я не могу напечатать его. Я смог распечатать его, если вынул код состояния из регулярного выражения. Я не знаю, почему я получаю ошибку без атрибута, когда для него есть атрибуты. Вот строка тестового кода, чтобы помочь вам запустить его. Я должен был взять его из файла, но я не могу загрузить файл здесь. '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 "" - "

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

В вашем регулярном выражении не было места перед кодом состояния, присутствующим в ваших примерах данных.

Также обратите внимание, что вам не нужно экранировать двойные кавычки ", если вы заключили Ваша строка в одинарных кавычках. Если вы избежите их с помощью \" и используете необработанную строку, вы введете литеральную обратную косую черту sh.

Используемое мной регулярное выражение, которое вы можете увидеть в действии на https://regex101.com/r/XB31hj/1, равно:

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])'
    )
0 голосов
/ 29 апреля 2020

Попробуйте:

...

for line in f:
    m = re.match(regexp, line)
    if m:
        cnt_clientIPs.update([m.group('clientIP')])
        matched += 1
    else:
        failed += 1
        continue
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...