Python 格式化re.findall()的输出

Python 格式化re.findall()的输出,python,regex,format,Python,Regex,Format,我正在尝试筛选access.log中找到的每个IP地址(读取并转换为字符串),然后统计它们的出现次数。我可以这样做,但列表中IP地址的格式很奇怪。列表中的一个元素是“('110'、'78'、'168'、'85')”而不是“('110.78.168.85')”。如何使其看起来像IP地址 我试着阅读Stackoverflow的其他答案,但似乎没有一个能解决我的问题 重新导入 f=open(“/var/log/apache2/access.log”,“r”) f_as_string=f.read()

我正在尝试筛选access.log中找到的每个IP地址(读取并转换为字符串),然后统计它们的出现次数。我可以这样做,但列表中IP地址的格式很奇怪。列表中的一个元素是“('110'、'78'、'168'、'85')”而不是“('110.78.168.85')”。如何使其看起来像IP地址

我试着阅读Stackoverflow的其他答案,但似乎没有一个能解决我的问题

重新导入
f=open(“/var/log/apache2/access.log”,“r”)
f_as_string=f.read()
f、 关闭()
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]|[01]。\(25[0-5]|[2[0-4][0-9]|[01]|[0-9]?)\(25[0-5]| 2[0-4][0-9]、[0-9]、[0-9]1249]、[0-9]1249]、[0-9]1249]1249]、[U]。。(25[0-5[0-5[0-5[0-5
# ...
而不是

('110', '78', '168', '85')

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']
或者,保持regex模式不变,并使用
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']

你不需要一个正则表达式,只需要拆分(“.”?另外,避免使用打开和关闭文件的显式方法来处理文件。从
access.log
?提供一个示例数据示例文件:111.222.333.123 HOME-[01/Feb/1998:01:08:39-0800]“GET/bannerad/ad.htm HTTP/1.0”200 198““Mozilla/4.01(Macintosh;I;PPC)”111.222.333.123主页-[01/Feb/1998:01:08:46-0800]“GET/bannerad/ad.htm HTTP/1.0“200 28083”“”Mozilla/4.01(Macintosh;I;PPC)
>>> 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']