我试图使用正则表达式在文件中查找唯一的IP地址实例。我发现它们很好并尝试将它们附加到列表中,然后尝试在列表中使用set()
来删除重复项。我发现每个项目都没问题并且有重复但我无法获得简化列表。打印我的设置的输出与将ips打印为列表相同,没有任何内容被删除。
ips = [] # make a list
count = 0
count1 = 0
for line in f: #loop through file line by line
match = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line) #find IPs
if match: #if there's a match append and keep track of the total number of Ips
ips.append(match) #append to list
count = count + 1
ipset = set(ips)
print(ipset, count)
此字符串<_sre.SRE_Match object; span=(0, 13), match='137.43.92.119'>
在尝试set()
列表之前和之后的输出中显示了60多次
答案 0 :(得分:11)
您没有存储匹配的字符串。您正在存储re.Match
objects。即使它们匹配相同的文本,它们也不会相等,所以它们都被set
对象视为唯一:
>>> import re
>>> line = '137.43.92.119\n'
>>> match1 = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line)
>>> match1
<_sre.SRE_Match object; span=(0, 13), match='137.43.92.119'>
>>> match2 = re.search("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", line)
>>> match2
<_sre.SRE_Match object; span=(0, 13), match='137.43.92.119'>
>>> match1 == match2
False
改为提取匹配的文字:
ips.append(match.group()) #append to list
不带参数的 matchobj.group()
返回匹配的字符串部分(组0):
>>> match1.group()
'137.43.92.119'
>>> match1.group() == match2.group()
True