Форум сайта 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 строчки кода!
Теперь мне есть что проанализировать и поизучать из примеров
Офлайн