Как найти индексы в предложении

Привет!
Есть ли готовы методы для нахождения всех вхождений подстроки в строке? Метод indexOf для строки вернёт только первое вхождение, а мне нужно найти все индексы подстроки в строке.
Например в строке «abc bca abcabc cba» подстрока «abc встречается 3 раза, индексы — 0, 8, 11, мне нужен метод, который вернёт в виде массива все индексы.


  • Вопрос задан

    более трёх лет назад

  • 3907 просмотров

*»Сложность алгоритма это не улучшает»*—если вы уберёте if element = subtext[0], то сложность по прежнему будет O(n*m). Если вы думаете, что на практике if element делает код быстрее, то это вероятно, но в этом случае следует указывать benchmark, который вы использовали для сравнения (конкретную реализацию (например, на pypy, я бы попробовал: for j, c in enumerate(subtext): if text[i + j] != c: break # unequal ..), ожидаемый ввод (размер, частоты символов) итд).

– jfs

16 апр 2016 в 7:13

I want to search for a bi-gram in a sentence and find its index. For example, take the following sentence:

in the absence of functional studies it is not possible at present to conclude that
drug is a disease-related drug.

Here am trying to search for «is a» and not «is» as there there is «is» and «is a» in the sentence.

I currently use ArrayList to store the sentence and use «equals» and «contains» for comparison but the result is that I pick up the index of is and returns 7 and not the index of «is a». I use Java in my code.

Andre Silva's user avatar

Andre Silva

4,7729 gold badges52 silver badges65 bronze badges

asked Feb 3, 2014 at 1:52

user2957777's user avatar

This would get you index (number of charatcers) of «is a» in a very simple way

 int index= "in the absence of functional studies it is not possible at present to conclude that drug is a disease-related drug.".indexOf("is a");

When you start splitting by whitespace, you need to start caring about punctuation too…
Natural language processig is much more complicated, you should take a look at http://lucene.apache.org/core/

answered Nov 24, 2014 at 20:24

Hurda's user avatar

HurdaHurda

4,6378 gold badges35 silver badges49 bronze badges

Часто нам нужно найти символ в строке python. Для решения этой задачи разработчики используют метод find(). Он помогает найти индекс первого совпадения подстроки в строке. Если символ или подстрока не найдены, find возвращает -1.

Синтаксис

string.find(substring,start,end)

Метод find принимает три параметра:

  • substring (символ/подстрока) — подстрока, которую нужно найти в данной строке.
  • start (необязательный) — первый индекс, с которого нужно начинать поиск. По умолчанию значение равно 0.
  • end (необязательный) — индекс, на котором нужно закончить поиск. По умолчанию равно длине строки.

Параметры, которые передаются в метод, — это подстрока, которую требуются найти, индекс начала и конца поиска. Значение по умолчанию для начала поиска — 0, а для конца — длина строки.

В этом примере используем метод со значениями по умолчанию.

Метод find() будет искать символ и вернет положение первого совпадения. Даже если символ встречается несколько раз, то метод вернет только положение первого совпадения.


>>> string = "Добро пожаловать!"
>>> print("Индекс первой буквы 'о':", string.find("о"))
Индекс первой буквы 'о': 1

Поиск не с начала строки с аргументом start

Можно искать подстроку, указав также начальное положение поиска.

В этом примере обозначим стартовое положение значением 8 и метод начнет искать с символа с индексом 8. Последним положением будет длина строки — таким образом метод выполнит поиска с индекса 8 до окончания строки.


>>> string = "Специалисты назвали плюсы и минусы Python"
>>> print("Индекс подстроки 'али' без учета первых 8 символов:", string.find("али", 8))
Индекс подстроки 'али' без учета первых 8 символов: 16

Поиск символа в подстроке со start и end

С помощью обоих аргументов (start и end) можно ограничить поиск и не проводить его по всей строке. Найдем индексы слова «пожаловать» и повторим поиск по букве «о».


>>> string = "Добро пожаловать!"
>>> start = string.find("п")
>>> end = string.find("ь") + 1
>>> print("Индекс первой буквы 'о' в подстроке:", string.find("о", start, end))
Индекс первой буквы 'о' в подстроке: 7

Проверка есть ли символ в строке

Мы знаем, что метод find() позволяет найти индекс первого совпадения подстроки. Он возвращает -1 в том случае, если подстрока не была найдена.


>>> string = "Добро пожаловать!"
>>> print("Есть буква 'г'?", string.find("г") != -1)
Есть буква 'г'? False
>>> print("Есть буква 'т'?", string.find("т") != -1)
Есть буква 'т'? True

Поиск последнего вхождения символа в строку

Функция rfind() напоминает find(), а единое отличие в том, что она возвращает максимальный индекс. В обоих случаях же вернется -1, если подстрока не была найдена.

В следующем примере есть строка «Добро пожаловать!». Попробуем найти в ней символ «о» с помощью методов find() и rfind().


>>> string = "Добро пожаловать"
>>> print("Поиск 'о' методом find:", string.find("о"))
Поиск 'о' методом find: 1
>>> print("Поиск 'о' методом rfind:", string.rfind("о"))
Поиск 'о' методом rfind: 11

Вывод показывает, что find() возвращает индекс первого совпадения подстроки, а rfind() — последнего совпадения.

Второй способ поиска — index()

Метод index() помогает найти положение данной подстроки по аналогии с find(). Единственное отличие в том, что index() бросит исключение в том случае, если подстрока не будет найдена, а find() просто вернет -1.

Вот рабочий пример, показывающий разницу в поведении index() и find():


>>> string = "Добро пожаловать"
>>> print("Поиск 'о' методом find:", string.find("о"))
Поиск 'о' методом find: 1
>>> print("Поиск 'о' методом index:", string.index("о"))
Поиск 'о' методом index: 1

В обоих случаях возвращается одна и та же позиция. А теперь попробуем с подстрокой, которой нет в строке:


>>> string = "Добро пожаловать"
>>> print("Поиск 'г' методом find:", string.find("г"))
Поиск 'г' методом find: 1
>>> print("Поиск 'г' методом index:", string.index("г"))
Traceback (most recent call last):
File "pyshell#21", line 1, in module
print("Поиск 'г' методом index:", string.index("г"))
ValueError: substring not found

В этом примере мы пытались найти подстроку «г». Ее там нет, поэтому find() возвращает -1, а index() бросает исключение.

Поиск всех вхождений символа в строку

Чтобы найти общее количество совпадений подстроки в строке можно использовать ту же функцию find(). Пройдемся циклом while по строке и будем задействовать параметр start из метода find().

Изначально переменная start будет равна -1, что бы прибавлять 1 у каждому новому поиску и начать с 0. Внутри цикла проверяем, присутствует ли подстрока в строке с помощью метода find.

Если вернувшееся значение не равно -1, то обновляем значением count.

Вот рабочий пример:


my_string = "Добро пожаловать"
start = -1
count = 0

while True:
start = my_string.find("о", start+1)
if start == -1:
break
count += 1

print("Количество вхождений символа в строку: ", count )

Количество вхождений символа в строку:  4

Выводы

  • Метод find() помогает найти индекс первого совпадения подстроки в данной строке. Возвращает -1, если подстрока не была найдена.
  • В метод передаются три параметра: подстрока, которую нужно найти, start со значением по умолчанию равным 0 и end со значением по умолчанию равным длине строки.
  • Можно искать подстроку в данной строке, задав начальное положение, с которого следует начинать поиск.
  • С помощью параметров start и end можно ограничить зону поиска, чтобы не выполнять его по всей строке.
  • Функция rfind() повторяет возможности find(), но возвращает максимальный индекс (то есть, место последнего совпадения). В обоих случаях возвращается -1, если подстрока не была найдена.
  • index() — еще одна функция, которая возвращает положение подстроки. Отличие лишь в том, что index() бросает исключение, если подстрока не была найдена, а find() возвращает -1.
  • find() можно использовать в том числе и для поиска общего числа совпадений подстроки.

Я хочу найти биграмм в предложении и найти его индекс. Например, возьмите следующее предложение:

в отсутствие функциональных исследований в настоящее время невозможно сделать вывод о том, что препарат является лекарственным средством, связанным с болезнью.

Здесь я пытаюсь найти «есть», а не «есть», поскольку там есть «есть» и «есть» в предложении.

В настоящее время я использую ArrayList для хранения предложения и использую «equals» и «contains» для сравнения, но результатом является то, что я забираю индекс is и возвращает 7, а не индекс «is a». Я использую Java в своем коде.

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти своих знакомых в инстаграме
  • Как по обьему куба найти ребро куба
  • Как найти любовницу в возрасте
  • Как найти радиус описанная окружность равнобедренном треугольнике
  • Как найти юмор видео

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии