К вашему сведению, это не дубликат, пожалуйста, удалите этот тег.
Пробовал packaging.version.Version не работает на 1.0.2h и 192.168.0.3.
Вопрос
Я получаю версии разных библиотек/двоичных файлов в списке. И этот список включает в себя несколько мусорных значений версии наряду с правильной. Я хочу написать код Python, который может отделять правильные версии от списка версий.
Пожалуйста, предложите логику или библиотеку python, которая может сделать следующее
Псевдокод
Correct_verList = []
verList = ['2.6.36', '1.2.dfgdf', '1.sdfsdgsdsf', '3.0/0+3*/1,-/0/0,//O*K1', 'so.802', '5.0(side)', '6.2*20hm' , '192.168.0.222', '1.33', '0.97a', '1.0.2h', '2.4.2b3']
#Psuedo Code
for ver in verList:
if ver is the correct version:
Correct_verList.append(ver)
print(Correct_verList)
Ожидаемый результат
Correct_verList = [1.33, 0.97a, 2.6.36, 1.0.2h, 2.4.2b3]
Если вы снова посмотрите на ответ, version.Version("1.3.xy123") проверит, является ли строка действительной версией или нет.
packaging.version.Version вроде не позволяет 1.0.2h.
packaging.version.Version говорит, что 192.168.0.12 это версия, на самом деле это не версия.
Невозможно добавить ответ из-за дубликата, но если ваше требование очень конкретно состоит из числа, за которым следует точка, за которой следует комбинация букв и цифр, за которой может следовать точка, и комбинация букв и цифр, вы можете решить это с помощью регулярное выражение, что-то вроде import re; result = [x for x in verList if re.fullmatch('\d+\.\w+(\.\w+)?', x)]
@tfw этот код работает для данного списка. Но это слишком специфично для данного списка. Там написано 2.sfufdf, 2.34e.34e и 2.0.xxxdd версии, но это не так. И похоже, что я ничего не могу сделать с дубликатом, это зависит от @DeveshKumarSingh
Ваши требования все еще не очень ясны для меня, но, возможно, вместо этого их могло бы решить выражение (\d+\.){1,2}\d+\w*. Кроме того, как предложил ответчик, я рекомендую вам прочитать документацию для RegEx и немного поэкспериментировать с ней, например. через регулярное выражение101 или RegExr.






То, что вы ищете, называется регулярное выражение. Эта ссылка предоставляет вам документацию по регулярному выражению Python.
Это регулярное выражение может выполнить эту работу: '(([0-9]+[.]){1,2}([0-9]*([0-9]|[a-z]){0,2}[0-9]+)'
Что вы можете сделать, так это использовать метод findall() и проверить, является ли результат той же строкой, которую вы тестировали. Код будет таким (я его не тестировал):
import re
Correct_verList = []
verList = ['2.6.36', '3.0/0+3*/1,-/0/0,//O*K1', 'so.802', '5.0(side)', '6.2*20hm' , '192.168.0.222', '1.33', '0.97a', '1.0.2h', '2.4.2b3']
for ver in verList:
a=re.findall('(([0-9]+[.]){1,2}([0-9]*([0-9]|[a-z]){0,2}[0-9]+)',ver)
if len(a)!=0:
if a[0][0]==ver:
Correct_verList.append(ver)
print(Correct_verList)
Это регулярное выражение не будет соответствовать всем его требованиям. Обратите внимание, что буквы могут быть включены в последний сегмент.
@tfw вы правы, в последнем символе сегмента также возможен
@Umair исправил. Соответствует ли он вашим требованиям?
@TUIlover, в коде ошибка.
@Umair исправил. Тем не менее, вы не объяснили, почему 192.168.0.12 не должно быть в списке, и мой код не исключает его
@TUIlover 192.168.0.12 — это IP-адрес. К вашему сведению, версия имеет максимум три сегмента.
@Umair теперь должно работать
Спасибо @TUIlover, это работает. Не могли бы вы ограничить количество символов, появляющихся в последнем сегменте, максимум двумя. Например, 1.2.dfgdf и 1.sdfsdgsdsf не являются версиями.
@Umair Вместо этого вы должны использовать это регулярное выражение: '(([0-9]+[.]){1,2}([0-9]*([0-9]|[a-z]){0,2}[0-9]+)'. Я настоятельно рекомендую вам прочитать это. 7.2.1. Раздел короткий и очень полезный, так как регулярные выражения реализованы таким образом во многих языках. Если вы считаете, что на вопрос дан ответ, пожалуйста, проголосуйте за ответ и отметьте вопрос как отвеченный.
@TUIlover Наконец-то я это сделал...RegEx это потрясающая библиотека. Спасибо, я сделаю это.
@DeveshKumarSingh, дорогой, это другое, так как нужно выяснить, является ли строка версией или нет. а ты предложил сравнение версий.