Во-первых, ваше регулярное выражение будет соответствовать медленнее, чем если бы вы прекратили жадное совпадение.
.*Dog.*
эквивалентно
Dog
, но последний совпадает быстрее, потому что не происходит возврата. Чем длиннее струны, тем более вероятно, что «Собака» появляется несколько раз, и, следовательно, больше работы по поиску движка regex. Как таковой, ". * D" фактически гарантирует возврат.
Тем не менее, как насчет:
#! /usr/bin/env python
import re # regular expressions
import fileinput # read from STDIN or file
my_regex = '.*Dog.*'
my_matches = 0
for line in fileinput.input():
line = line.strip()
if re.search(my_regex, line):
if my_matches == 0:
print(line)
my_matches = my_matches + 1
else:
if my_matches != 0:
print('::::: Pattern %s repeats %i more times.' % (my_regex, my_matches - 1))
print(line)
my_matches = 0
Непонятно, что должно происходить с не соседними матчами.
Также не ясно, что должно происходить с однострочными совпадениями, окруженными несоответствующими строками. Добавьте «Doggy» и «Hula» во входной файл, и вы получите соответствующее сообщение «0» больше раз.