Это регулярное выражение будет соответствовать всем числам, делящимся на три:
^([0369]|[147][0369]*([147][0369]*[258][0369]*)*([147][0369]*[147]|[258])|[258][0369]*([258][0369]*[147][0369]*)*([258][0369]*[258]|[147]))+$
Вот пример сеанса ipython с использованием этой конструкции:
In [1]: import re
In [2]: my_ids = '1, 2, 3, 4, 5, 6, 7'
In [3]: idres = [x[0] for x in re.findall(r'\b([0369]|[147][0369]*([147][0369]*[258][0369]*)*([147][0369]*[147]|[258])|[258][0369]*([258][0369]*[147][0369]*)*([258][0369]*[258]|[147]))+\b', my_ids)]
In [4]: idres
Out[4]: ['3', '6']
Это можно сделать, хотя - если вы уверены, что ваш ввод содержит только целые числа, разделенные запятыми (а не, скажем, слова), ответ от Florian Diesch содержит более здравый способ сделать это.
Различия: ответ Флориана преобразует все который разделяется запятыми на целые числа (может вызвать проблему, когда вход не правильно сформирован), разделите их и верните их как целочисленные, если они будут работать. Версия regex будет просто сканировать вход для любых чисел, делящихся на три (которые имеют границы слов с обеих сторон) и возвращать их как строки.
Вы уверены, что начальные / конечные разделы не перекрываются?
Кроме того, один диск можно разделить на 4 первичных первичных и 3 расширенных раздела OR 3, я не совсем уверен, что эта конфигурация будет правильно обрабатывать этот случай. Вам придется перепроверить параметры конфигурации, чтобы убедиться, что это правильно.
Это в основном мое предположение.