正则表达式在列表

时间:2016-04-21 15:00:56

标签: python regex list python-3.x

我是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作为起点

4 个答案:

答案 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。因此,它会产生一个错误,表明它预期为stringbuffer

注: - 另外,您需要确保至少有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中的ipaddressCounter来帮助解决此问题......

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 金额。