re.ПОДРОБНЫЙ и dict

#python #regex #dictionary

#python #регулярное выражение #словарь

Вопрос:

У меня есть this .txt с некоторыми журналами* Я пытаюсь присвоить значение «-» «имя_пользователя» в случае, если в файле нет имени пользователя. Но в этих случаях на выходе dict отображается это «имя_пользователя»:»». Вы знаете, что я делаю не так? Я также пытался использовать item.groupdict[«имя_пользователя»] = «-«, но, очевидно, это не корень проблемы…

 import re
with open("logdata.txt", "r") as file:
    logdata = file.read()
logs = []
pattern = """
(?P<host>[d.] )[-s] 
(?P<user_name>w*)s 
[(?P<time>[^][] )]s 
"(?P<request>[^"] )"
"""

for item in re.finditer(pattern,logdata,re.VERBOSE):
    **if item.groupdict("user_name") == None:
        item["user_name"] = '-'**
    logs.append(item.groupdict())

  

Вот пример текста:

 71.172.239.195 - dooley1853 [21/Jun/2019:15:45:32 -0700] "PUT /cutting-edge HTTP/2.0" 406 24498
180.95.121.94 - mohr6893 [21/Jun/2019:15:45:34 -0700] "PATCH /extensible/reinvent HTTP/1.1" 201 27330
144.23.247.108 - auer7552 [21/Jun/2019:15:45:35 -0700] "POST /extensible/infrastructures/one-to-one/enterprise HTTP/1.1" 100 22921
  

Комментарии:

1. Я сомневаюсь, что объект re match реализует какой-либо способ изменения результатов сопоставления. Вам нужно извлечь groupdict в переменную, изменить этот dict , а затем добавить его в свой список.

Ответ №1:

Вы можете либо сохранить item.groupdict() в переменной, либо изменить ее содержимое, прежде чем добавлять его в logs

 for item in re.finditer(pattern, logdata, re.VERBOSE):
    params = item.groupdict()
    if params["user_name"] == "":
        params["user_name"] = "-"

    logs.append(params)
  

или вы могли бы изменить свое регулярное выражение, чтобы сделать вторую группу необязательной ( ? ), но сопоставлять слова только с хотя бы одним символом ( w ), а затем использовать default параметр item.groupdict() :

 import re

with open("logdata.txt", "r") as file:
    logdata = file.read()

logs = []
pattern = """
(?P<host>[d.] )[-s] 
(?P<user_name>w )?s 
[(?P<time>[^][] )]s 
"(?P<request>[^"] )"
"""

for item in re.finditer(pattern, logdata, re.VERBOSE):
    logs.append(item.groupdict(default="-"))
  

Ответ №2:

Я использовал более простую технику

S не пробел хотя бы один раз

 import re
with open("logdata.txt", "r") as file:
    logdata = file.read()
logs = []
pattern = """
(?P<host>[d.] )[-s] 
(?P<user_name>S )s 
[(?P<time>[^][] )]s 
"(?P<request>[^"] )"
"""

for item in re.finditer(pattern,logdata,re.VERBOSE):
    logs.append(item.groupdict())
  

работает идеально. Я просто немного опоздал, я полагаю.