我是Python的新手,并且已经编译了一个文件中的项目列表,该文件中包含文件中出现的元素及其在文件中的频率
('95.108.240.252', 9)
它主要是我收集的IP地址。我想像这样输出地址和频率
IP Frequency
95.108.240.252 9
我正在尝试通过重新编写列表项并打印它来执行此操作但是当我尝试TypeError: expected string or bytes-like object
这是我现在用来做的所有代码:
ips = [] # IP address list
for line in f:
match = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line) # Get all IPs line by line
if match:
ips.append(match.group()) # if found add to list
from collections import defaultdict
freq = defaultdict( int )
for i in ips:
freq[i] += 1 # get frequency of IPs
print("IP\t\t Frequency") # Print header
freqsort = sorted(freq.items(), reverse = True, key=lambda item: item[1]) # sort in descending frequency
for c in range(0,4): # print the 4 most frequent IPs
# print(freqsort[c]) # This line prints the item like ('95.108.240.252', 9)
m1 = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", freqsort[c]) # This is the line returning errors - trying to parse IP on its own from the list
print(m1.group()) # Then print it
还没有尝试解析频率,只想将IP作为起点
答案 0 :(得分:1)
改为使用字节对象:
# notice the `b` before the quotes.
match = re.search(b'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line)
答案 1 :(得分:1)
re.search()
中的第二个参数应该是字符串,并且您正在传递tuple
。因此,它会产生一个错误,表明它预期为string
或buffer
。
注: - 另外,您需要确保至少有4个IP地址元素,否则会出现index out of bounds
错误
删除最后两行并改为使用
print(freqsort[c][0])
如果您想坚持自己的格式,可以使用以下内容,但没有用处
m1 = re.search(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", freqsort[c][0]) # This is the line returning errors - trying to parse IP on its own from the list
print(m1.group())
答案 2 :(得分:0)
尝试正面和负面的正则表达式。
(?<=\(\')(.*)(?=\').*(\d+)
首先捕获的组将是您的IP和第二频率。
答案 3 :(得分:0)
您可以使用stdlib中的ipaddress
和Counter
来帮助解决此问题......
from collections import Counter
from ipaddress import ip_address
with open('somefile.log') as fin:
ips = Counter()
for line in fin:
ip, rest_of_line = line.partition(' ')[::2]
try:
ips[ip_address(ip)] += 1
except ValueError:
pass
print(ips.most_common(4))
这也将处理IPv4和IPv6风格的地址,并确保它们在技术上不正确而且不仅仅是&#34;外观&#34;正确。使用collections.Counter
还会为您提供.most_common()
方法,以便按最频繁的方式自动排序,并将其限制为 n 金额。