#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())
работает идеально. Я просто немного опоздал, я полагаю.