python — Подсчёт вхождений перекрывающейся подстроки в строку
Вопрос задан
Изменён 1 год 1 месяц назад
Просмотрен 20k раза
Вхождение подстрок в строку обычно находится примерно таким образом:
print stroka.count("podstroka")
Проблема этого подхода в том, что, если у нас стоит условие найти вхождения перекрывающихся подстрок, оно работает неправильно.
Например, есть строка "avava avavava"
и надо найти вхождения подстроки "vav"
. Код выше даст результат 2, однако, по логике, должно быть 3, так как в начале есть vav
, потом два вхождения в vavav
.
Как это правильно реализовать?
- python
- строки
3
Вот версия, которая избегает излишнего копирования входной строки:
def count_overlapping_substrings(haystack, needle): count = 0 i = -1 while True: i = haystack. find(needle, i+1) if i == -1: return count count += 1 print(count_overlapping_substrings('avavrewwevavavewrewrew vavvavav ', 'vav')) # -> 6
Время исполнения — квадратичное, как и у других вариантов, которые используют str.find()
метод.
6
Можно, например, через регеспы и «lookahead»:
# -*- coding: utf-8 -*- import re def count_substrings(string, substring): substring_re = '(?=(%s))' % re.escape(substring) return len(re.findall(substring_re, string)) print count_substrings('avavrewwevavavewrewrew vavvavav ', 'vav') # == 6
Причем на мелких строках он медленней, чем предложенные выше варианты, но вот начиная уже с 100 символов начинает сильно выигрывать. Я потестировал скорость, тут результаты. Регекспы в 1.23 раза быстрее. С увеличением строки эта разница будет возрастать.
5
Если на скорую руку, то можно так:
s = 'avavrewwevavavewrewrew' ind = 1 count = 0 f = 'vav' while ind != -1: ind = s. find(f) if ind >= 0: count += 1 s = s[ind+1:] print count
Суть в отбрасывании первого символа подстроки, чтобы он её больше не находил.
2
@spirit только ind >= 0.
s = 'avavrewwevavavewrewrew' ind = 1 count = 0 f = 'vav' while ind != -1: ind = s.find(f) if ind >= 0: count += 1 s = s[ind+1:] print count
2
def greed_count(str, substr): return 0 if len(str) < len(substr) else str.startswith(substr) + greed_count(str[1:], substr) print(greed_count('avavrewwevavavewrewrew', 'vav'))
2
x="avava avavava" a=x # переприсваивание, чтобы не потерять изначальную строку c=0 # переменная - счётчик while "vav" in a: # цикл, в котором мы и будем считать кол-во вхождений c+=1 # замена на начало находимой подстроки # если бы мы искали не vav, а vava, то замена была бы на va, а не на v a=a. replace("vav", "v", 1) print(c)
Зарегистрируйтесь или войдите
Регистрация через GoogleРегистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
поиск строк в файле по ключевым словам — NTA на vc.
ruЕсть решение, как с помощью Python осуществить поиск строк в файле по ключевым словам в столбцах.
8182 просмотров
Несомненно, многие из нас в своей работе не раз сталкивались с необходимостью фильтрации данных в файле excel, обычно мы делаем это через встроенный в программу фильтр, но бывают ситуации, когда нужно осуществить отбор строк по большому количеству условий (в нашем случае – по ключевым словам) сразу по нескольким столбцам.
Рассмотрим задачу более подробно. Например, у нас есть файл excel с обращениями клиентов в банк (тысячи строк), который содержит следующие колонки: «ИНН клиента», «Дата обращения», «Обращение», «Решение». В столбце «Обращение» содержится текст обращения клиента, в столбце «Решение» — ответ банка на обращение. Суть обращений может быть абсолютно любой (кредитование, страхование, эквайринг и т.д).
Требуется с помощью поиска ключевых слов/сочетаний слов (например, «КАСКО», «ОСАГО», «автострахов», «залог…авто» и т.
п.) в колонках «Обращение» и «Решение» выбрать обращения клиентов, которые относятся к страхованию автотранспорта. Нужные слова могут содержаться как в обоих столбцах, так и в одном из них.Конечно, можно начать фильтровать данные колонки в excel, но это будет долго и трудоёмко, особенно, если слов для поиска подходящих обращений много (или столбцов, в которых необходимо найти ключевые слова). Поэтому для решения нашей задачи требуется более удобный инструмент – Python.
Ниже представлен код, с помощью которого мы отберем необходимые обращения клиентов:
# Импорт библиотек. import pandas as pd import numpy as np import re #Чтение исходного файла с данными. df = pd.read_excel(r’ПУТЬ К ФАЙЛУ\Название исходного файла с данными.xlsx’, dtype=’str’) # Регулярные выражения. # Шаблон (слова/сочетания слов, которые необходимо найти в столбцах). r = r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.
Подробно с информацией о модуле re, функциями и синтаксисом регулярных выражений в Python можно ознакомиться по следующим ссылкам: https://docs-python.ru/standart-library/modul-re-python/, https://docs-python.ru/standart-library/modul-re-python/sintaksis-reguljarnogo-vyrazhenija/.
Поясним, что «.*?» в выражении (страх.*?транспорт) ищет между «страх» и «транспорт» любое количество символов, вопросительный знак отключает жадность алгоритма поиска (поиск заканчивается как только находится первый «транспорт»).
#Для каждой строки ищем шаблон в столбце «Обращение». obr = df[‘Обращение’].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: obr = df[‘ Обращение ‘].str.lower().str.contains(r) #Для каждой строки ищем шаблон в столбце «Решение». otvet = df[‘Решение’].apply(lambda x: re.search(r, str(x).lower())) #другой вариант: otvet = df[‘Решение’].str.lower().str.contains(r) #Для каждой строки проверяем наличие шаблона хотя бы в одном из столбцов «Обращение» и «Решение» (результат — True/False).
itog = np.any(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0) #Результат (оставляем только те строки в таблице, по которым получен результат True). new_df = df[itog] #Запись результата в excel. new_df.to_excel(‘Название итогового файла.xlsx’, index=False)В результате получаем новый файл excel, в который полностью скопированы нужные нам обращения клиентов:
— в обращении клиента с ИНН 1111111111 в столбцах «Обращение» и «Решение» содержится слово «КАСКО»;
— в обращении клиента с ИНН 333333333333 в столбце «Решение» содержатся сочетания слов «залог…транспорт», «транспорт…страх», «залог…авто», «страх…авто»;
— в обращении клиента с ИНН 444444444444 в столбце «Обращение» содержатся сочетания слов «страх…транспорт»; «транспорт…залог».
Количество столбцов, в которых можно производить поиск ключевых слов, не ограничен – в приведенном примере их два, но у вас может быть больше.
При необходимости для каждого столбца можно задать свой шаблон для поиска слов:
#Шаблон 1 для столбца «Обращение». r1= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)’ #Шаблон 2 для столбца «Решение». r2= r'(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)’ #Поиск шаблонов 1 и 2 в столбцах «Обращение» и «Решение» соответственно. obr = df[‘Обращение’].apply(lambda x: re.search(r1, str(x).lower())) otvet = df[‘Решение’].apply(lambda x: re.search(r2, str(x).lower()))
Если требуется выбрать строки, в которых ключевые слова содержатся и в том, и в другом столбце, то нужно заменить функцию any() на all():
itog = np.all(np.array([~obr.isnull(), ~otvet.isnull()]), axis=0)
Теперь рассмотрим ситуацию, когда у нас имеется несколько файлов excel с обращениями клиентов (с аналогичной структурой столбцов), и необходимо в каждом выбрать подходящие обращения.
Тогда код, с помощью которого мы отберем нужные строки, будет выглядеть так:
#Импорт библиотек. import pandas as pd import numpy as np import os import re import warnings #Игнорирование всех предупреждений. warnings.filterwarnings(‘ignore’) #Путь к папке с исходными файлами. path = r’ПУТЬ К ПАПКЕ С ФАЙЛАМИ ‘ #Регулярные выражения. #Шаблон (слова/сочетания слов, которые необходимо найти в столбцах). r= r'(каско)|(осаго)|(страх.*?транспорт)|(транспорт.*?страх)|(страх.*?авто)|(авто.*?страх)|(залог.*?транспорт)|(транспорт.*?залог)|(залог.*?авто)|(авто.*?залог)|(автострахов)’ #Создание папки, в которую будут сохраняться файлы с нужными обращениями. os.makedirs(‘Нужные обращения’, exist_ok=True) #Получение списка полных имён для всех файлов xlsx в папке с исходными файлами. docs = [] for root, _, files in os.walk(path): for file in files: if file.split(‘.’)[-1] == ‘xlsx’: docs.append(os.path.join(root, file)) print(f’В директории {path} \nобнаружено {len(docs)} файлов’) #Для каждого файла из списка производим его чтение, поиск шаблона в столбцах «Обращение» и «Решение», проверяем наличие шаблона хотя бы в одном из данных столбцов, оставляем только те строки в таблице, по которым получен результат True, записываем результат в excel в папку «Нужные обращения».
В результате создается папка «Нужные обращения», в которой содержатся новые файлы excel с полностью скопированными нужными обращениями клиентов. По количеству и названию данные файлы соответствуют исходным.
Таким образом, благодаря Python поиск строк в файлах по ключевым словам в столбцах становится быстрым и несложным делом. Приведенный код значительно ускоряет и упрощает работу аналитика в части фильтрации строк по большому количеству условий по нескольким столбцам.
Как эффективно найти подстроку в строке
Резюме : в этом руководстве вы узнаете, как эффективно использовать метод Python string find()
для поиска подстроки в строке.
Знакомство со строковым методом Python find()
find()
— это строковый метод, который находит подстроку в строке и возвращает индекс подстроки.
Ниже показан синтаксис метода find()
:
str.find(sub[ start[ end]]) Язык кода: CSS (css)
Метод find()
принимает три параметра:
-
sub
— это подстрока для поискастр
. Параметры -
start
иend
интерпретируются как в срезеstr[start:end]
, который указывает, где искать подстрокуsub
.
Оба параметра start
и end
являются необязательными. start
Параметр по умолчанию равен нулю. А параметр end
по умолчанию равен length-1
, где length
— это длина str
.
Если str
не содержит подстроки sub
в срезе str[start:end]
, метод find()
возвращает -1.
На практике метод find()
следует использовать только в том случае, если вы хотите узнать позицию подстроки. Если вы просто хотите проверить, содержит ли строка подстроку, вы должны использовать вместо оператора
:
sub in str
Примеры метода Python string find()
Давайте рассмотрим несколько примеров использования метода find()
.
1) Использование метода Python string find() для поиска подстроки в строке
В следующем примере показано, как использовать метод find()
для поиска подстроки 'Johny'
в строке 'Johny Джонни Да Папа'
:
s = 'Джони Джонни Да Папа' результат = s.find('Python') печать(результат) Язык кода: PHP (php)
Вывод:
0
Поскольку строка 'Johny Johny Yes Papa'
имеет две подстроки 'Johny'
, find() 9000 6 метод возвращает индекс первое вхождение подстроки
'Johny'
.
2) Использование метода Python string find() для поиска подстроки в строке внутри среза
В следующем примере используется метод find()
для поиска подстроки 'Johny'
в строке 'Johny Johny Yes Papa'
в срезе str[1:]
:
s = 'Johny Johny Yes Papa' результат = s.find('Джонни', 1) print(result) Язык кода: PHP (php)
Вывод:
6
В этом примере метод find()
возвращает индекс второго вхождения подстроки 'Johny'
в строка 'Джони, Джони, да, папа'
.
3) Подстрока не существует в строке пример
Следующий пример возвращает -1, так как подстрока 'Julia'
не существует в строке 'Johny Johny Yes Papa'
:
s = 'Johny Johny Yes Papa' результат = s.find('Юлия') print(result) Язык кода: PHP (php)
Вывод:
-1
Сводка
- Используйте строку Python
find()
, чтобы найти подстроку в строке. - Метод
find()
возвращает -1, если подстрока не найдена.
Этот урок был вам полезен?
Python String find() с примерами
Spread the love
Функция Python String find() используется для поиска позиции индекса первого вхождения символа или первого вхождения строки или первого вхождения из указанного положение и т.д. Обратите внимание, что строка Python представляет собой набор символов, и ее индекс начинается с нуля. Перейдем к нашей статье.
1. Краткие примеры метода string.find()
Ниже приведены краткие примеры метода string.find().
# Краткие примеры string.find() # Рассмотрим строку command = "Посетите обучающие программы Sparkby. очень, очень приятно!" # Найти 'i' с самого начала print("i вхождение - ",command.find("i")) # Найти 'i' с 6-й позиции print("i вхождение -", command.find("i",6)) # Найти 'i' с 6-й по 40-ю позиции print("i вхождение -", command.find("i",6,40)) # Найти 'sparkby' print("sparkby - ",command. find("sparkby")) # Найти «очень» из 29позиция print("очень-",command.find("очень",29))
2. Python String find()
Метод find() используется для возврата индекса первого вхождения указанного символа или указанной строки. Если символ или подстрока найдены, возвращается позиция. Индексация в строке начинается с 0. Возвращает -1, если символ или строка не найдены. Он принимает три параметра: sub_str, start и stop. Давайте посмотрим на синтаксис и параметры.
2.1 Синтаксис строки find()
Ниже приведен синтаксис функции String find().
#Синтаксис find() string.find(sub_str,старт,стоп)
2.2 Параметры find()
- Первый параметр является обязательным, в котором нам нужно передать символ таким образом, чтобы была возвращена его первая встречающаяся позиция индекса.
- Второй необязательный параметр, который принимает индекс (целое число), чтобы указать, где нам нужно начать поиск. По умолчанию это 0.
- Третий необязательный параметр, который принимает индекс (целое число), чтобы указать, где нам нужно закончить поиск. По умолчанию это индекс последнего символа строки. Другими словами, длина строки — 1,9.0032
2.3 Возврат find()
Если указанный символ или подстрока существует в строке, будет возвращена позиция индекса первого вхождения.
Если указанный символ не существует в строке, возвращается -1.
3. Python String find() Пример
Давайте запустим примеры функции Python String find() с комбинацией параметров. Для приведенных ниже примеров я использую String «посетите учебные пособия Sparkby. очень очень хорошо!". Проверьте, как эта строка представлена в Python с позицией индекса.
Позиция индекса строки Python3.1 Поиск символа из начальной позиции строки
Чтобы найти позицию индекса первого вхождения символа или подстроки с начала, используйте первый параметр find(). Это по умолчанию начинает поиск указанного вхождения с начальной позиции строки.
# Рассмотрим строку command = "Посетите обучающие программы Sparkby. очень, очень приятно!" печать (команда) # Найти 'i' с самого начала print("i вхождение - ",command. find("i")) # Найти 's' с самого начала print("вхождение s - ",command.find("s")) # Найдите «я» с самого начала print("Вхождение I - ",command.find("I")) # Выход: # посетите учебники sparkby. очень очень хорошо! # i вхождение - 1 # с появлением - 2 # I вхождение - -1
Объяснение:
Мы видим, что первое вхождение символа «i» находится в индексе 1, первое вхождение символа «s» — в индексе 2, а символ «I» не существует. в строке, поэтому возвращается -1.
3.2 Поиск символа из указанной позиции
Чтобы найти позицию индекса первого вхождения символа или подстроки от начала указанной позиции строки Python, используйте первые два параметра find(). Это по умолчанию начинает поиск указанных вхождений с указанной начальной позиции строки до конца.
# Рассмотрим строку command = "Посетите обучающие программы Sparkby. очень, очень приятно!" печать (команда) # Найти 'i' с 6-й позиции print("i вхождение -", command.find("i",6)) # Найти 's' с 10-й позиции print("вхождение s - ",command. find("s",10)) # Найти 't' с 23-й позиции print("вхождение t - ",command.find("t",23)) # Выход: # посетите учебники sparkby. очень очень хорошо! # i вхождение - 19 # с появлением - 22 # t вхождение - -1
Объяснение:
Мы видим, что первое вхождение символа – 'i' находится в индексе-19 с 6-й позиции, первое вхождение символа – 's' находится в индексе-22 с 10-й позиции и символа – 't ' не существует в строке с 23-й позиции индекса. поэтому для него возвращается -1.
3.3 Поиск символа между указанными позициями
Чтобы найти позицию индекса первого вхождения символа или подстроки из указанной начальной позиции и продолжить до указанной конечной позиции, используйте все три параметра find().
# Рассмотрим строку command = "Посетите обучающие программы Sparkby. очень, очень приятно!" печать (команда) # Найти 'i' с 6-й по 40-ю позиции print("i вхождение -", command.find("i",6,40)) # Найти 's' с 7-й по 25-ю позицию print("вхождение s - ",command. find("s",7,25)) # Найти 't' с 12-й позиции на 23-ю позицию print("вхождение t - ",command.find("t",12,23)) # Выход: # посетите учебники sparkby. очень очень хорошо! # i вхождение - 19 # с появлением - 22 # t вхождение - 14
Объяснение:
Мы видим, что первое вхождение символа «i» находится в индексе-19 между 6 и 40 позициями, первое вхождение символа «s» находится в индексе-22 в между 7 и 25 позициями, а первое появление символа «t» находится в индексе-14 между 12 и 23 позициями.
4. Python Поиск подстроки в строке
Все приведенные выше примеры мы использовали для поиска вхождения символа, давайте посмотрим, как найти подстроку в строке.
# Рассмотрим строку command = "Посетите обучающие программы Sparkby. очень, очень приятно!" печать (команда) # Найти 'sparkby' print("sparkby - ",command.find("sparkby")) # Найти «очень» print("очень-",command.find("очень")) # Найти 'very' с 29-й позиции print("очень-",command.find("очень",29)) # Выход: # посетите учебники sparkby.