set()不删除重复项

时间:2016-04-20 17:07:10

标签: python regex list python-3.x set

我试图使用正则表达式在文件中查找唯一的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多次

1 个答案:

答案 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