set()不删除重复项

Bit*_*low 3 python regex list set python-3.x

我正在尝试使用正则表达式在文件中找到唯一的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)
Run Code Online (Sandbox Code Playgroud)

<_sre.SRE_Match object; span=(0, 13), match='137.43.92.119'>在尝试set()列表之前和之后,此字符串在输出中显示60次以上

Mar*_*ers 11

您没有存储匹配的字符串.您正在存储re.Match对象.即使它们匹配相同的文本,它们也不会相等,所以它们被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
Run Code Online (Sandbox Code Playgroud)

改为提取匹配的文本:

ips.append(match.group()) #append to list
Run Code Online (Sandbox Code Playgroud)

matchobj.group() without参数返回匹配的字符串部分(组0):

>>> match1.group()
'137.43.92.119'
>>> match1.group() == match2.group()
True
Run Code Online (Sandbox Code Playgroud)