Форум сайта python.su
Всем привет!
Нужна помощь в очистке списка 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']
Отредактировано Voodoo (Апрель 22, 2025 18:59:43)
Офлайн
У меня вот так получилось
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" ))
Отредактировано Rodegast (Апрель 23, 2025 01:13:06)
Офлайн
>>> 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'] >>>
Офлайн
Rodegast
py.user.next
Большое спасибо!
Все варианты работают! И в 1-2 строчки кода!
Теперь мне есть что проанализировать и поизучать из примеров
Офлайн
Всем привет! Без ваc, мне точно не справиться…
Чуть усложнилась задача, и добавился “мусор” между цифрами:
Пример списка с IP:
FCK $10.1:10.$106a.1 y i $ o $ 10o.11f0 .-10a6.ч {10 fd
10.110.106.1 10.110.106.10
['10.110.106.1', '10.110.106.10']
10.1.10.106.1 10.11.0.106.10
['10.1.10.106.1', '10.11.0.10.6.10']
Офлайн
> Во 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") ])
Офлайн
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'] >>>
Офлайн