Я пытаюсь отфильтровать каждый IP-адрес, найденный в access.log (который считывается и преобразуется в строку), а затем подсчитываю их появление. Я могу это сделать, но формат IP-адресов в списке странный. Одним из элементов списка является "('110', '78', '168', '85')" вместо "('110.78.168.85')". Как мне сделать так, чтобы он выглядел как IP-адрес?
Я пытался прочитать другие ответы на Stackoverflow, но ни один из них, похоже, не решил мою проблему.
import re
f = open("/var/log/apache2/access.log", "r")
f_as_string = f.read()
f.close()
x = re.findall(r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)', f_as_string)
# ...
('110.78.168.85')
вместо
('110', '78', '168', '85')
Кроме того, избегайте обработки файлов с таким явным подходом к открытию и закрытию файла.
Предоставить образец данных из access.log
?
Пример файла: 111.222.333.123 HOME - [01/фев/1998:01:08:39 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 198 "referrer.com/bannerad/ba_intro.htm" "Mozilla/4.01 (Macintosh; I; PPC )" 111.222.333.123 ГЛАВНАЯ - [01/Фев/1998:01:08:46 -0800] "GET /bannerad/ad.htm HTTP/1.0" 200 28083 "referrer.com/bannerad/ba_intro.htm" "Mozilla/4.01 (Macintosh; I; PPC) "
findall
вернет список групп, если в вашем шаблоне есть группы захвата. В вашем шаблоне четыре пары скобок, поэтому findall
возвращает список групп кортежей из четырех элементов.
Попробуйте написать свой шаблон, используя незахватывающие круглые скобки.
>>> import re
>>> f_as_string = "foobar 110.78.168.85 bazqux 123.45.067.89"
>>> re.findall(r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)', f_as_string)
['110.78.168.85', '123.45.067.89']
В качестве альтернативы оставьте шаблон регулярного выражения таким, каким он был, и используйте finditer
для извлечения только полных групп из объектов соответствия.
>>> import re
>>> f_as_string = "foobar 110.78.168.85 bazqux 123.45.067.89"
>>> [m.group() for m in re.finditer(r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)', f_as_string)]
['110.78.168.85', '123.45.067.89']
Вам действительно не нужно регулярное выражение для этого, просто
split(".")
?