Перекрывающееся регулярное выражение

#python #regex

#python #регулярное выражение

Вопрос:

Мне нужно регулярное выражение, которое соответствует любому набору цифр с одной возможной точкой. Если после него есть еще одна точка и больше цифр, выполните совпадение с предыдущими цифрами, точкой и следующими цифрами.
пример строки = 'aa323aa232.02.03.23.99aa87..0.111111.mm'
желаемые результаты = [323, 232.02, 02.03, 03.23, 23.99, 87, 0.111111]

в настоящее время используется:

 import re
i = 'aa323aa232.02.03.23.99aa87..0.111111.mm'
matches = re.findall(r'(?=(d .{0,1}d ))', i)
print matches  
  

вывод:

 ['323', '23', '232.02', '32.02', '2.02', '02.03', '2.03', '03.23', '3.23', '23.99', '3.99', '99', '87', '0.111111', '111111', '11111', '1111', '111', '11']
  

Комментарии:

1. Разве 99 это не результат сам по себе?

Ответ №1:

При этом используется прогнозное утверждение для захвата, а затем другое выражение для поглощения символов в соответствии с вашими правилами:

 >>> import re
>>> i = 'aa323aa232.02.03.23.99aa87..0.111111.mm'
>>> re.findall(r'(?=(d (?:.d )?))d (?:.d (?!.?d))?', i)
  

Вывод

 ['323', '232.02', '02.03', '03.23', '23.99', '87', '0.111111']
  

Комментарии:

1. 1 — В частности, решением Python будет re.findall('(?=(d (?:.d )?))d (?:.d (?!.?d))?', i) where i — строка.