Найти - Пользователи
Полная версия: Очистить список 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 строчки кода!

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



Voodoo
Всем привет! Без ваc, мне точно не справиться…
Чуть усложнилась задача, и добавился “мусор” между цифрами:

Пример списка с IP:
 FCK $10.1:10.$106a.1 y i $
o $ 10o.11f0 .-10a6.ч {10 fd

На выходе должна произойти очистка и IP адреса примут правильный вид:
 10.110.106.1
10.110.106.10

Затем перевести список в такой формат:
 ['10.110.106.1', '10.110.106.10']
(сам не смог переделать, как не пытался со splitlines(), split() и.т.д.)



В 1-м примере от Rodegast получился такой результат (добавились лишние точки):
 10.1.10.106.1
10.11.0.106.10


Во 2-м примере от Rodegast получился верный результат, все ОК!
Но как писал выше, не смог, перевести в нужный формат.


В 3-м примере от py.user.next получился такой результат (добавились лишние точки):
 ['10.1.10.106.1', '10.11.0.10.6.10']
Формат уже тот что нужен! Супер)


В общем хелп! Застрял на этих моментах.

Большое спасибо)
Rodegast
> Во 2-м примере от Rodegast получился верный результат, все ОК!
> Но как писал выше, не смог, перевести в нужный формат.

Нужный формат это список? Тогда так:
 list_ip = """  FCK $10.1:10.$106a.1 y i $
o $ 10o.11f0 .-10a6.ч {10 fd[s][/s]"""
 
print([ "".join( y for y in x if y in ".0123456789" ) for x in list_ip.split("\n") ])
py.user.next
Voodoo
В 3-м примере от py.user.next получился такой результат (добавились лишние точки):
  
>>> import re
>>> 
>>> text = """
... FCK $10.1:10.$106a.1 y i $
... o $ 10o.11f0 .-10a6.ч {10 fd
... $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.110.106.1', '10.110.106.10', '10.138.100.65', '10.138.120.129', '10.138.105.1', '10.138.105.225', '192.168.233.188', '30.12.15.115']
>>>
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