Python re.findall печать всех шаблонов
>>> match = re.findall('a.*?a', 'a 1 a 2 a 3 a 4 a')
>>> match
['a 1 a', 'a 3 a']
Как заставить его печатать
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
спасибо!
3 ответов
Я думаю, что использование положительного утверждения lookahead должно сделать трюк:
>>> re.findall('(?=(a.*?a))', 'a 1 a 2 a 3 a 4 a')
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
re.findall
возвращает все группы в регулярном выражении, включая группы в look-aheads. Это работает, потому что утверждение look-ahead не потребляет ни одной строки.
Вы можете использовать альтернативный regex
модуль, который позволяет перекрывать матчи:
>>> regex.findall('a.*?a', 'a 1 a 2 a 3 a 4 a', overlapped = True)
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
r = re.compile('a.*?a') # as we use it multiple times
matches = [r.match(s[i:]) for i in range(len(s))] # all matches, if found or not
matches = [m.group(0) for m in matches if m] # matching string if match is not None
print matches
дает
['a 1 a', 'a 2 a', 'a 3 a', 'a 4 a']
Я не знаю, является ли это лучшим решением, но здесь я проверяю каждую подстроку, доходящую до конца строки, на соответствие заданному шаблону.