Эта функция довольно неэффективна, но она решает вашу проблему:
def find_shortest_overlapping_matches(pattern, line):
pat=re.compile(pattern)
n=len(line)
ret=[]
for start in xrange(0, n):
for end in xrange(start+1, n+1):
tmp=line[start:end]
mat=pat.match(tmp)
if mat is not None:
ret.append(tmp)
break
return ret
print find_shortest_overlapping_matches("a.*d", "abcabdcd")
Выход:
['abcabd', 'abd']
Диапазоны предполагают, что ваш шаблон содержит хотя бы один символ и не соответствует пустой строке. Кроме того, вам следует рассмотреть возможность использования ?
для несжатого сопоставления шаблонов, чтобы повысить производительность и избежать внутреннего цикла.