Без флага re.MULTILINE
флаг $
соответствует только в конце строки.
Чтобы упростить отладку, разделите код на несколько частей, которые вы можете проверить самостоятельно.
def extract_ips(data):
return re.findall(r"\d{1,3}(?:\.\d{1,3}){3}", data)
2130706433
, «1 :: 1» . 999.999.999.999
. Вы можете проверить ip-строку, используя socket.inet_aton()
или более общий socket.inet_pton()
. Вы можете даже разбить вход на части без поиска ip и использовать эти функции, чтобы сохранить допустимые ips. Если входной файл невелик, и вам не нужно сохранять исходный порядок ips:
with open(filename) as infile, open(outfilename, "w") as outfile:
outfile.write("\n".join(set(extract_ips(infile.read()))))
В противном случае:
with open(filename) as infile, open(outfilename, "w") as outfile:
seen = set()
for line in infile:
for ip in extract_ips(line):
if ip not in seen:
seen.add(ip)
print >>outfile, ip