首页 > 解决方案 > re.findall(str(list[0]) 正在搜索列表项中的第一个字符,而不是完整的字符串

问题描述

我正在创建一个程序来查找日志文件中的所有 IPv4 地址并显示这些地址出现的次数。我正在使用 Python 的 re 库。在我尝试遍历地址列表以计算它们出现的次数之前,它的效果很好。当我从列表中调用一个项目并将其转换为字符串时, re.findall() 将仅搜索该字符串中的第一个字符,而不是字符串本身。

当我传入一个完整的字符串时,它工作得很好,当我将列表中的项目作为字符串打印时,它也会显示完整的地址。我还尝试在代码的不同位置使用 str() 方法,这似乎无法解决问题。re.findall() 方法也需要一个字符串。

创建的字符串如下所示: [['111.222.333.124'], ['111.222.333.123'], ['111.222.333.124'], ['111.222.333.123'], ['111.222.333.123'], ['111.222.333.123'], ['111.222.333.123'], ['111.222.333.123'], ['111.222.333.124'], ['111.222.333.125'], ['111.222.333.125'], [' 11.222.333.123'], ['111.222.333.126']]

def findDuplicates(list):
    string_list = str(list)
    target = list[0]
    x = len(re.findall(str(target) , string_list))
    print(target, " occurs ", x, "times!")

['111.222.333.124'] 出现 217 次!

此地址在日志文件中出现 3 次。数字 1 出现了 217 次。

标签: pythonregex

解决方案


好的快速问题:如果您正在查找列表中的项目,其中项目与您正在寻找的对象相同,为什么不比较整个项目?通常,当您尝试查找部分匹配时,保留 re ,但这似乎不是您在这里所做的。就像是:

counter = 0
for i in list:
    if i == target:
        counter+=1
print(counter)

我敢打赌,你会发生什么,当你 str(list) 你得到 '111.222.333.124' 时,你得到 '111.222.333.124',然后list[0]你得到1,所以然后1被输入到re.findall比赛中。我会检查的。


推荐阅读