Python имеет string.find()
и string.rfind()
получить индекс подстроки в строке.
Мне интересно, есть ли что-то подобное, string.find_all()
которое может вернуть все найденные индексы (не только первый с начала или первый с конца).
Например:
string = "test test test test"
print string.find('test') # 0
print string.rfind('test') # 15
#this is the goal
print string.find_all('test') # [0,5,10,15]
'ttt'.find_all('tt')
вернуться?'ttt'.rfind_all('tt')
, что должно возвращать «1»Ответы:
Нет простой встроенной строковой функции, которая делает то, что вы ищете, но вы можете использовать более мощные регулярные выражения :
Если вы хотите найти совпадающие совпадения, Lookahead сделает это:
Если вам нужен обратный поиск всех без наложений, вы можете объединить положительный и отрицательный взгляд в следующее выражение:
re.finditer
возвращает генератор , так что вы могли бы изменить[]
в приведенном выше, чтобы()
получить генератор вместо списка, который будет более эффективным, если вы только итерируете результаты один раз.источник
[m.start() for m in re.finditer('test', 'test test test test')]
, как мы можем искатьtest
илиtext
? Становится ли это намного сложнее?Таким образом, мы можем построить это сами:
Никаких временных строк или регулярных выражений не требуется.
источник
start += len(sub)
наstart += 1
.re.findall
, я бы рекомендовал добавитьlen(sub) or 1
вместоlen(sub)
, иначе этот генератор никогда не завершится на пустой подстроке.Вот (очень неэффективный) способ получить все (то есть даже перекрывающиеся) совпадения:
источник
Опять же, старый поток, но вот мое решение с использованием генератора и простой
str.find
.пример
возвращается
источник
Вы можете использовать
re.finditer()
для неперекрывающихся матчей.но не будет работать для:
источник
Давай, давайте вернемся вместе.
Нет необходимости в регулярных выражениях таким образом.
источник
RecursionError
если их будет достаточно много. Другой - два одноразовых списка, которые он создает на каждой итерации только для добавления одного элемента, что очень неоптимально для функции поиска строк, которую можно вызывать много раз. Хотя иногда рекурсивные функции кажутся изящными и ясными, к ним следует относиться с осторожностью.Если вы просто ищете один символ, это будет работать:
Также,
Я догадываюсь, что ни один из них (особенно № 2) не очень эффективен.
источник
это старая тема, но я заинтересовался и хотел поделиться своим решением.
Должен возвращать список позиций, где найдена подстрока. Пожалуйста, прокомментируйте, если вы видите ошибку или место для улучшения.
источник
Это делает трюк для меня, используя re.finditer
источник
Эта тема немного старая, но у меня это сработало:
источник
Ты можешь попробовать :
источник
Независимо от того, что решения, предоставленные другими, полностью основаны на доступном методе find () или любых доступных методах.
Вызов метода
источник
Эта функция не просматривает все позиции внутри строки, она не тратит вычислительные ресурсы. Моя попытка:
чтобы использовать это, назовите это так:
источник
При поиске большого количества ключевых слов в документе используйте flashtext
Flashtext работает быстрее, чем регулярные выражения в большом списке поисковых слов.
источник
источник
Это решение аналогичного вопроса от хакерранка. Я надеюсь, что это может помочь вам.
Вывод:
источник
Разрезая, мы находим все возможные комбинации и добавляем их в список и определяем, сколько раз это происходит, используя
count
функциюисточник
s="test test test test"
иf="test"
ваш код печатается4
, но ожидается, что OP[0,5,10,15]
пожалуйста, посмотрите на код ниже
источник
Питонический путь будет:
источник
lambda
этого способа не является Pythonic и идет против PEP8 . 3) Это не дает правильного вывода для ситуации ОПВы можете легко использовать:
https://www.programiz.com/python-programming/methods/string/count
Ура!
источник