Я превратил проблему в проблему сопоставления с образцом и попытался использовать RE для ее решения.
Преобразованная проблема: для строки «0/1», например s = '111100111111100111111001'
, попробуйте найти точно 3 совпадений подстроки:
a '1'
, за которым следует произвольное количество любых символов, а затем 2 последовательных '1's
и общий размер совпадение не менее 4.
Вышеуказанное требование может быть закодировано как шаблон RE: '1.{1,}11'
. И обратный образец также принят: '11.{1,}1'
. Кроме того, интервал любых двух соседних совпадений должен использовать как можно меньше символов.
Все это переводится, как показано ниже:
> import re
> s = '111100111111100111111001'
> p = '.*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?'
> ret = re.match(p, s)
> ret.groups()
Результат:
> ('1111001111111', '1111', '11001')
Этот результат хороший, но неоптимальный в этом смысле: длина каждого матча должна быть максимально сбалансированной.
Уточненный результат должен быть:
('1111001', '1111111', 11111001 ')
Но как я могу использовать RE для наложения этого ограничения?