python - 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 次。
解决方案
好的快速问题:如果您正在查找列表中的项目,其中项目与您正在寻找的对象相同,为什么不比较整个项目?通常,当您尝试查找部分匹配时,保留 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
比赛中。我会检查的。
推荐阅读
- mysql - 在 Cloud SQL 中使用 LOAD DATA INFILE 和 SELECT INTO OUTFILE
- c# - 带有 Protobuf 序列化的 WCF:忽略要序列化的属性 [ProtoIgnore] 时,是否需要显式标记 [DataMember]?
- c++ - Visual Studio 2015 C++ 解决方案 can't see svn exe in system PATH
- python - Store images into multiply array and use it to train model
- javascript - 使用 Strophe.js 解析 XML websocket 响应
- r - How to perfrom MAP estimation in a Bayesian Network in R?
- python - how to convert a multiple python files into one ipynb file?
- android - Transparent Toolbar is Gray
- r - How to write R code for mcmc of a changepoint logistic model
- node.js - Firebase Cloud Functions 在实时数据库 onCreate 上获取数据