Python 正则表达式在列表的元素中查找匹配项

Python 正则表达式在列表的元素中查找匹配项,python,regex,list,python-3.x,Python,Regex,List,Python 3.x,我是Python新手,我编写了一个文件中的项目列表,其中包含文件中出现的一个元素及其在文件中的频率,如下所示 ('95.108.240.252', 9) 我收集的主要是IP地址。我想像这样输出地址和频率 IP Frequency 95.108.240.252 9 print(freqsort[c][0]) 我试图通过重新设置列表项并打印它来实现这一点,但当我尝试TypeError时,它返回以下错误:预期的字符串或字节,如object 这是我现在用来做所有事情

我是Python新手,我编写了一个文件中的项目列表,其中包含文件中出现的一个元素及其在文件中的频率,如下所示

('95.108.240.252', 9)
我收集的主要是IP地址。我想像这样输出地址和频率

IP               Frequency
95.108.240.252   9
print(freqsort[c][0])
我试图通过重新设置列表项并打印它来实现这一点,但当我尝试
TypeError时,它返回以下错误:预期的字符串或字节,如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

甚至还没有尝试解析频率,只是希望IPs作为起点

使用字节对象:

# notice the `b` before the quotes.
match = re.search(b'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', line)

尝试使用带有正面和负面观察的正则表达式

(?<=\(\')(.*)(?=\').*(\d+)

(?在
re.search()
中的第二个参数应该是string,并且您正在传递
tuple
。因此它生成了一个错误,表示它需要
string
buffer

注意:-您还需要确保IP地址至少有4个元素,否则将出现
索引超出范围的错误

删除最后两行,改用此行

IP               Frequency
95.108.240.252   9
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())

您可以使用stdlib中的
ipaddress
计数器来帮助执行此操作

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样式的地址,并确保它们在技术上是正确的,而不仅仅是“外观”正确。使用
集合。计数器也会为您提供
。最常见()
方法自动按最频繁的次数排序,并将其限制为n个数量。

返回此错误的
类型错误:无法在类似字符串的对象上使用字节模式
这很奇怪。您是否尝试打印
?它输出了什么?这是一行,有100多行:
95.108.240.252--[14/Feb/2013:00:59:06+0000]“GET/robots.txt HTTP/1.1”404534“-”Mozilla/5.0(兼容;YandexBot/3.0+http://yandex.com/bots)"
这是我正在阅读的文件中出现的一行,我不确定我是否理解,你能告诉我这行会去哪里,它会做什么,或者它如何影响我已经拥有的东西吗?啊,我刚刚列出了正则表达式,但将遵循一个示例aleem,我想他正在寻找修复
类型错误
频率排序[c]
是tupleWhich line抛出错误比特流?如
re.search
导致问题,还是
('95.108.240.252',9)
通常出现在哪一行itself@JonClements当我打印它时,它会这样做,这是从outputjust use re.findall(“(ip regex)”,第[0]行复制的捕捉和积累这条简单的线更适合我需要的东西谢谢你,尽管我不明白你的意思note@BitFlow您正在对范围(0,4)中的c使用
循环..如果少于4个元素(IP地址),会发生什么情况…它将生成<代码>列表索引超出范围<代码>错误..4实际上是我代码中的一个变量N,有大约70行,尽管我在尝试输入更高的数字时注意到它返回了一个错误。是否类似于
if N>len(freqsort):sys.exit(2)
如何防止这种情况发生?编辑:删除
@BitFlow它可以正常工作。您可以使用它。编辑:-或者您可以保留一个计数器。当它超过
len(freqsort)
时,您将中断循环。这将打印一些值,直到没有更多的值出现