Формат вывода re.findall()

Я пытаюсь отфильтровать каждый 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')

Вам действительно не нужно регулярное выражение для этого, просто split(".")?

DirtyBit 08.04.2019 16:40

Кроме того, избегайте обработки файлов с таким явным подходом к открытию и закрытию файла.

DirtyBit 08.04.2019 16:40

Предоставить образец данных из access.log?

DirtyBit 08.04.2019 16:41

Пример файла: 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) "

topkek 08.04.2019 18:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
346
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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']

Другие вопросы по теме