Простой встроенной строковой функции, которая делает то, что вы ищете, не существует, но вы могли бы использовать более мощные регулярные выражения:
import re [m.start() for m in re.finditer('test', 'test test test test')] #[0, 5, 10, 15]
Если вы хотите найти перекрывающиеся совпадения, lookahead сделает это:
[m.start() for m in re.finditer('(?=tt)', 'ttt')] #[0, 1]
Если вам нужен обратный поиск- все без перекрытий, вы можете объединить положительный и отрицательный анализ в выражение, подобное этому:
search = 'tt' [m.start() for m in re.finditer('(?=%s)(?!.{1,%d}%s)' % (search, len(search)-1, search), 'ttt')] #[1]
re.finditer возвращает генератор, поэтому вы могли бы изменить [] в приведенном выше на (), чтобы получить генератор вместо списка, который будет более эффективным, если вы повторяете результаты только один раз.
Ответ 2
>>> help(str.find) Help on method_descriptor:
find(...) S.find(sub [,start [,end]]) -> int
Таким образом, мы можем создать ее сами:
deffind_all(a_str, sub): start = 0 whileTrue: start = a_str.find(sub, start) if start == -1: return yield start start += len(sub) # use start += 1 to find overlapping matches
import re sentence = input("Give me a sentence ") word = input("What word would you like to find ") for match in re.finditer(word, sentence): print (match.start(), match.end())
Для word = "this" и sentence = "this is a sentence this this" это даст результат: