Найти - Пользователи
Полная версия: Очистить список IP от посторонних символов
Начало » Python для новичков » Очистить список IP от посторонних символов
1
Voodoo
Всем привет!

Нужна помощь в очистке списка IP от постороннего мусора, далее эти IP будут использоваться для подключения по ssh.
Проверка на валидность не нужна, будем считать, что сами адреса правильные.

Данную задачу я можно сказать почти решил, но решение, конечно же страшное и смешное).

Итак, возьмем для примера такой списочек в файле (не спрашивайте меня, откуда взялся этот мусор)) ):

 $10.138.$100.65 y i $
10.138 .120.ч 129 fd
FCK10ж.138{.105.1ww
o  10d.138eee#.105.225 x
z192.168.233 .188r A
) 30.12 f.15D.115#

Как делал очистку:
 import os
import subprocess
import re
import netmiko
os.system('clear')
with open ("addresses.txt", 'r') as addresslist:
    hosts = addresslist.read()
def LeaveOnlyNumbersAndDots(x):
    return (re.findall(r'[0-9\.]+', x))
# Удалить спецсимволы, кроме ' (не нашел как символ ' можно заэкранировать). Точку . не трогаем.
# При использовании re.sub, все сливается в одну строку и не понятно, как потом разделять
aaa = (hosts.replace\
('`', 'NULL').replace('~', 'NULL').replace('!', 'NULL').\
replace('@', 'NULL').replace('#', 'NULL').replace('$', 'NULL').replace('%', 'NULL').\
replace('^', 'NULL').replace('&', 'NULL').replace('*', 'NULL').replace('(', 'NULL').\
replace(')', 'NULL').replace('-', 'NULL').replace('+', 'NULL').replace('^_', 'NULL').\
replace('=', 'NULL').replace('[', 'NULL').replace(']', 'NULL').replace('\\', 'NULL').\
replace('{', 'NULL').replace('}', 'NULL').replace('|', 'NULL').replace(';', 'NULL').\
replace(':', 'NULL').replace('"', 'NULL').replace(',', 'NULL').replace('/', 'NULL').\
replace('<', 'NULL').replace('>', 'NULL').replace('?', 'NULL'))
# Удалить все буквы
bbb = ''.join(i for i in aaa if not i.isalpha())
# Удалить все пробелы
ccc = bbb.replace(' ', '')
# Пройдемся ранее заготовленной функцией с паттерном r'[0-9\.]+' на случай если что-то не удалилось и для подготовки адресов для ssh
ipaddresses = (LeaveOnlyNumbersAndDots(ccc))
print(ipaddresses)
# Костыли сработали
# Результат: ['10.138.100.65', '10.138.100.129', '10.138.105.1', '10.138.105.225', '192.168.0.188', '30.12.15.15']

Как можно решить эту задачу правильно?
Rodegast
У меня вот так получилось
 import re
from functools import reduce
 
list_ip = """
 $10.138.$100.65 y i $
10.138 .120.ч 129 fd
FCK10ж.138{.105.1ww
o  10d.138eee#.105.225 x
z192.168.233 .188r A
) 30.12 f.15D.115#
"""
 
for x in list_ip.split("\n"):
	res = reduce(lambda x, y: x+y, re.findall(r"([0-9]*)\.*([0-9]*)", x))
	print(".".join( x for x in res if x ))

А ещё вот так:
 list_ip = """
 $10.138.$100.65 y i $
10.138 .120.ч 129 fd
FCK10ж.138{.105.1ww
o  10d.138eee#.105.225 x
z192.168.233 .188r A
) 30.12 f.15D.115#
"""
 
for x in list_ip.split("\n"):
	print("".join( y for y in x if y in ".0123456789" ))
py.user.next
  
>>> import re
>>> 
>>> text = """
...  $10.138.$100.65 y i $
... 10.138 .120.ч 129 fd
... FCK10ж.138{.105.1ww
... o  10d.138eee#.105.225 x
... z192.168.233 .188r A
... ) 30.12 f.15D.115#
... """
>>> 
>>> 
>>> ['.'.join(re.findall(r'\d+', i)) for i in text.splitlines() if i]
['10.138.100.65', '10.138.120.129', '10.138.105.1', '10.138.105.225', '192.168.233.188', '30.12.15.115']
>>>
Voodoo
Rodegast
py.user.next

Большое спасибо!

Все варианты работают! И в 1-2 строчки кода!

Теперь мне есть что проанализировать и поизучать из примеров



This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB