Что вы подразумеваете под "числом подстрок"? Положение подстроки? Сколько раз встречается подстрока? Что-то другое?
GreenMatt
2
Это домашнее задание? Если это так, добавьте тег «домашнее задание» к своему вопросу. Кроме того, ваш вопрос не очень понятен. Я отвечу на то, что вы, кажется, спрашиваете, но я подозреваю, что вы действительно хотите узнать что-то еще.
Как указано в комментариях, это способ сделать это для непересекающихся вхождений. Если вам нужно подсчитать перекрывающиеся вхождения, вам лучше проверить ответы по адресу: « Регулярное выражение Python находит все перекрывающиеся совпадения? », Или просто проверьте мой другой ответ ниже.
Как насчет этого: "GCAAAAAG".count("AAA")который дает 1, а правильный ответ - 3?
карикатурист
12
countочевидно для неперекрывающихся совпадений - что чаще всего и хочется делать. stackoverflow.com/questions/5616822/… имеет дело с перекрывающимися совпадениями - но простое, хотя и дорогое, выражение:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno
Можно ли считать / искать несколько слов одновременно? как string.count (substring1, substring2)
Сушант Кулкарни,
@SushantKulkarni Нет . Хотя есть один логический способ сделать такую вещь: string.count(substring1) + string.count(substring2). Но имейте в виду, что это неэффективный метод, если подстрок много, потому что подсчет каждой подстроки требует итерации по основной строке.
Фахил
Работа @SushantKulkarni ''.join([substring1, substring2]).count(pattern)более эффективна, чем решение, предложенное выше. Я проверил, используя timeit.
Энрик Калабуйг,
24
s ='arunununghhjj'
sb ='nun'
results =0
sub_len = len(sb)for i in range(len(s)):if s[i:i+sub_len]== sb:
results +=1print results
Я предполагаю, что вы имеете в виду s.find("su")и удивляетесь, почему вы получаете 0? Ну, это первый индекс подстроки "su"в s. Попробуйте, "ub"и вы получите 1, попробуйте, например, "z"и вы получите, -1как в подстроке не найдено.
Дон Вопрос
Я имею в виду, что вы всегда найдете только первый индекс, но не все индексы, @ arun-kumar-khattri дал правильный ответ
obohovyk
Я рад, что @ arun-kumar-khattri дал «правильный» ответ, который вы искали. Возможно, вам стоит взглянуть на комментарии jsbueno, иногда они отвечают на вопросы, которые вы еще не задали.
Дон Вопрос
Как и для третьего подхода. Кстати, я думаю, вы должны упомянуть, что это работает для непересекающихся случаев.
Зейнаб Аббасимазар
12
Лучший способ найти перекрывающуюся подстроку в данной строке - использовать регулярное выражение python, которое найдет все совпадающие совпадения, используя библиотеку регулярных выражений. Вот как это сделать, левая подстрока и справа вы предоставите строку для соответствия
Небольшой совет: вместо того, чтобы сказать «Это работает, потому что я проверил это», вы можете включить пример в онлайн-сервис, такой как repl.it, с некоторыми примерами данных.
Валентина
1
спасибо за комментарий Валентин! Это мой первый ответ здесь. Я улучшу себя от моих следующих ответов.
Бхарат Кумар Р
10
Вы можете посчитать частоту двумя способами:
Использование count()в str:
a.count(b)
Или вы можете использовать:
len(a.split(b))-1
Где aстрока и bподстрока, частота которой должна быть рассчитана.
Текущий лучший ответ, включающий метод, в countдействительности не учитывает перекрывающиеся вхождения и не заботится о пустых подстроках. Например:
>>> a ='caatatab'>>> b ='ata'>>>print(a.count(b))#overlapping1>>>print(a.count(''))#empty string9
Первый ответ должен быть 2не1 , если мы рассмотрим перекрывающиеся подстроки. Что касается второго ответа, лучше, если пустая подстрока возвращает 0 в качестве ответа.
нужна ли нам эта проверка if (string [j] == sub_string [0]):? не покрывается ли оно автоматически в последующих условиях if?
AnandViswanathan89
AnandViswanathan89, Оба, если требуются условия, if (string [j] == sub_string [0]) проверяет начальное совпадение символов в основной строке, которое должно быть выполнено для всех символов основной строки, и if (string [ j: j + len2] == sub_string) выполняет вхождение подстроки. Если это для первого случая, то для второго достаточно условия.
Амит В.В.
4
Вопрос не очень понятен, но я отвечу, что вы, на поверхности, спрашиваете.
Строка S длиной L символов, где S [1] - первый символ строки, а S [L] - последний символ, имеет следующие подстроки:
Нулевая строка ''. Есть один из них.
Для каждого значения A от 1 до L, для каждого значения B от A до L строка S [A] .. S [B] (включительно). Есть L + L-1 + L-2 + ... 1 из этих строк, в общей сложности 0,5 * L * (L + 1).
Обратите внимание, что второй элемент включает в себя S [1] .. S [L], то есть всю исходную строку S.
Итак, в строке длиной L. есть подстроки 0.5 * L * (L + 1) + 1. Отобразите это выражение в Python, и у вас будет количество подстрок, присутствующих в строке.
Слово для меня, спасибо. @santosh, почему бы не принять ответ?
Mawg говорит восстановить Monica
2
Я оставлю свой принятый ответ как «простой и очевидный способ сделать это» - однако это не распространяется на перекрывающиеся события. Выяснить это можно наивно, с многократной проверкой срезов - как в: sum ("GCAAAAAGH" [i:]. Начинается с ("AAA") для i в диапазоне (len ("GCAAAAAGH")))
(что дает 3) - это может быть сделано с помощью трюка с использованием регулярных выражений, как можно увидеть в регулярном выражении Python найти все перекрывающиеся совпадения? - и это также может помочь в игре в тонкий код. - Это мой счет «ручной работы» для перекрывающихся вхождений шаблонов в строке, который старается не быть чрезвычайно наивным (по крайней мере, он не создает новые строковые объекты при каждом взаимодействии):
def olpcount(string,pattern,case_sensitive=True):if case_sensitive !=True:
string = string.lower()
pattern = pattern.lower()
l = len(pattern)
ct =0for c in range(0,len(string)):if string[c:c+l]== pattern:
ct +=1return ct
test ='my maaather lies over the oceaaan'print test
print olpcount(test,'a')print olpcount(test,'aa')print olpcount(test,'aaa')
Как насчет строки с пониманием списка? Технически его 93 символа длиной, избавьте меня от пуризма PEP-8. Ответ regex.findall является наиболее читабельным, если он представляет собой фрагмент кода высокого уровня. Если вы создаете что-то на низком уровне и не хотите зависимостей, это довольно скудно и подло. Я даю частично совпадающий ответ. Очевидно, просто используйте счет как ответ с наибольшим количеством баллов, если нет совпадений.
def count_substring(string, sub_string):return len([i for i in range(len(string))if string[i:i+len(sub_string)]== sub_string])
string="abc"
mainstr="ncnabckjdjkabcxcxccccxcxcabc"
count=0for i in range(0,len(mainstr)):
k=0while(k<len(string)):if(string[k]==mainstr[i+k]):
k+=1else:breakif(k==len(string)):
count+=1;print(count)
Может быть, вы можете уточнить, чем это решение отличается от других, есть ли особый случай, который он может решить?
mpaskov
2
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Дональд Дак
0
import re
d =[m.start()for m in re.finditer(seaching, string)]print(d)
Это находит количество подстрок, найденных в строке, и отображает индекс.
импортировать re d = [m.start () для m в re.finditer (st3, st2)] # найти количество подстрок, найденных в строке, и отобразить индексный вывод print (d)
Бхаскар Редди К
0
my_string ="""Strings are amongst the most popular data types in Python.
We can create the strings by enclosing characters in quotes.
Python treats single quotes the same as double quotes."""Count= my_string.lower().strip("\n").split(" ").count("string")Count= my_string.lower().strip("\n").split(" ").count("strings")print("The number of occurance of word String is : ",Count)print("The number of occurance of word Strings is : ",Count)
Для простой строки с разделением пробелов использование Dict будет довольно быстрым, см. Код, приведенный ниже
def getStringCount(mnstr:str, sbstr:str='')->int:""" Assumes two inputs string giving the string and
substring to look for number of occurances
Returns the number of occurances of a given string
"""
x = dict()
x[sbstr]=0
sbstr = sbstr.strip()for st in mnstr.split(' '):if st notin[sbstr]:continuetry:
x[st]+=1exceptKeyError:
x[st]=1return x[sbstr]
s ='foo bar foo test one two three foo bar'
getStringCount(s,'foo')
Ниже логика будет работать для всех строковых и специальных символов
def cnt_substr(inp_str, sub_str):
inp_join_str =''.join(inp_str.split())
sub_join_str =''.join(sub_str.split())return inp_join_str.count(sub_join_str)print(cnt_substr("the sky is $blue and not greenthe sky is $blue and not green","the sky"))
В то время как все ответы приветствуются, ответы только на код, как правило, не очень хорошо объясняют предмет. Пожалуйста, добавьте некоторый контекст.
creyD
0
#counting occurence of a substring in another string (overlapping/non overlapping)
s = input('enter the main string: ')# e.g.'bobazcbobobegbobobgbobobhaklpbobawanbobobobob'
p=input('enter the substring: ')# e.g.'bob'
counter=0
c=0for i in range(len(s)-len(p)+1):for j in range(len(p)):if s[i+j]==p[j]:if c<len(p):
c=c+1if c==len(p):
counter+=1
c=0breakcontinueelse:breakprint('number of occurences of the substring in the main string is: ',counter)
Пожалуйста, подумайте над тем, чтобы добавить хотя бы какое-нибудь объяснение, как будто это ответ на вопрос
β.εηοιτ.βε
0
Вот решение, которое работает как для неперекрывающихся, так и для перекрывающихся случаев. Для пояснения: перекрывающаяся подстрока - это та, последний символ которой идентичен ее первому символу.
def substr_count(st, sub):# If a non-overlapping substring then just# use the standard string `count` method# to count the substring occurencesif sub[0]!= sub[-1]:return st.count(sub)# Otherwise, create a copy of the source string,# and starting from the index of the first occurence# of the substring, adjust the source string to start# from subsequent occurences of the substring and keep# keep count of these occurences
_st = st[::]
start = _st.index(sub)
cnt =0while start isnotNone:
cnt +=1try:
_st = _st[start + len(sub)-1:]
start = _st.index(sub)except(ValueError,IndexError):return cnt
return cnt
Ответы:
string.count(substring)
, как в:Обновить:
Как указано в комментариях, это способ сделать это для непересекающихся вхождений. Если вам нужно подсчитать перекрывающиеся вхождения, вам лучше проверить ответы по адресу: « Регулярное выражение Python находит все перекрывающиеся совпадения? », Или просто проверьте мой другой ответ ниже.
источник
"GCAAAAAG".count("AAA")
который дает 1, а правильный ответ - 3?count
очевидно для неперекрывающихся совпадений - что чаще всего и хочется делать. stackoverflow.com/questions/5616822/… имеет дело с перекрывающимися совпадениями - но простое, хотя и дорогое, выражение:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)
. Но имейте в виду, что это неэффективный метод, если подстрок много, потому что подсчет каждой подстроки требует итерации по основной строке.''.join([substring1, substring2]).count(pattern)
более эффективна, чем решение, предложенное выше. Я проверил, используя timeit.источник
В зависимости от того, что вы на самом деле имеете в виду, я предлагаю следующие решения:
Вы имеете в виду список подстрок, разделенных пробелами, и хотите знать, каков номер позиции подстроки среди всех подстрок:
Вы имеете в виду символьную позицию подстроки в строке:
Вы имеете в виду (непересекающиеся) отсчетов по появлению су-Подстрока:
источник
s.find("su")
и удивляетесь, почему вы получаете0
? Ну, это первый индекс подстроки"su"
вs
. Попробуйте,"ub"
и вы получите1
, попробуйте, например,"z"
и вы получите,-1
как в подстроке не найдено.Лучший способ найти перекрывающуюся подстроку в данной строке - использовать регулярное выражение python, которое найдет все совпадающие совпадения, используя библиотеку регулярных выражений. Вот как это сделать, левая подстрока и справа вы предоставите строку для соответствия
источник
Чтобы найти перекрывающиеся вхождения подстроки в строку в Python 3, этот алгоритм будет делать:
Я сам проверил этот алгоритм, и он работал.
источник
Вы можете посчитать частоту двумя способами:
Использование
count()
вstr
:a.count(b)
Или вы можете использовать:
len(a.split(b))-1
Где
a
строка иb
подстрока, частота которой должна быть рассчитана.источник
Текущий лучший ответ, включающий метод, в
count
действительности не учитывает перекрывающиеся вхождения и не заботится о пустых подстроках. Например:Первый ответ должен быть
2
не1
, если мы рассмотрим перекрывающиеся подстроки. Что касается второго ответа, лучше, если пустая подстрока возвращает 0 в качестве ответа.Следующий код заботится об этих вещах.
Теперь, когда мы запустим его:
источник
Сценарий 1: вхождение слова в предложение. например:
str1 = "This is an example and is easy"
. Появление слова «есть». Давайтеstr2 = "is"
Сценарий 2: Появление шаблона в предложении.
Спасибо!
источник
Вопрос не очень понятен, но я отвечу, что вы, на поверхности, спрашиваете.
Строка S длиной L символов, где S [1] - первый символ строки, а S [L] - последний символ, имеет следующие подстроки:
Итак, в строке длиной L. есть подстроки 0.5 * L * (L + 1) + 1. Отобразите это выражение в Python, и у вас будет количество подстрок, присутствующих в строке.
источник
Одним из способов является использование
re.subn
. Например, чтобы подсчитать количество вхождений'hello'
в любом сочетании случаев, вы можете сделать:источник
Я оставлю свой принятый ответ как «простой и очевидный способ сделать это» - однако это не распространяется на перекрывающиеся события. Выяснить это можно наивно, с многократной проверкой срезов - как в: sum ("GCAAAAAGH" [i:]. Начинается с ("AAA") для i в диапазоне (len ("GCAAAAAGH")))
(что дает 3) - это может быть сделано с помощью трюка с использованием регулярных выражений, как можно увидеть в регулярном выражении Python найти все перекрывающиеся совпадения? - и это также может помочь в игре в тонкий код. - Это мой счет «ручной работы» для перекрывающихся вхождений шаблонов в строке, который старается не быть чрезвычайно наивным (по крайней мере, он не создает новые строковые объекты при каждом взаимодействии):
источник
Перекрывающиеся случаи:
Полученные результаты:
источник
Для подсчета с перекрытием мы можем использовать:
Для непересекающегося случая мы можем использовать функцию count ():
источник
Как насчет строки с пониманием списка? Технически его 93 символа длиной, избавьте меня от пуризма PEP-8. Ответ regex.findall является наиболее читабельным, если он представляет собой фрагмент кода высокого уровня. Если вы создаете что-то на низком уровне и не хотите зависимостей, это довольно скудно и подло. Я даю частично совпадающий ответ. Очевидно, просто используйте счет как ответ с наибольшим количеством баллов, если нет совпадений.
источник
Если вы хотите подсчитать все подстроки (включая перекрытые), используйте этот метод.
источник
Если вы хотите узнать количество подстрок внутри любой строки; пожалуйста, используйте ниже код. Код легко понять, поэтому я пропустил комментарии. :)
источник
Я не уверен, рассматривал ли это что-то уже, но я думал об этом как о решении для слова, которое является "доступным":
Где слово это слово, которое вы ищете, а термин это термин, который вы ищете
источник
источник
Это находит количество подстрок, найденных в строке, и отображает индекс.
источник
источник
Риск снижения, потому что 2+ других уже предоставили это решение. Я даже проголосовал за одного из них. Но, пожалуй, новичкам легче всего понять.
источник
Для простой строки с разделением пробелов использование Dict будет довольно быстрым, см. Код, приведенный ниже
источник
Вы можете использовать
startswith
метод:источник
Ниже логика будет работать для всех строковых и специальных символов
источник
Вот решение в Python 3 и без учета регистра:
источник
источник
источник
источник
Это делает список всех вхождений (также перекрывающихся) в строке и подсчитывает их
Пример:
создаст этот список, но сохранит только значения BOLD :
[ab, bc , ca, ab, bc , cd]
что вернется:
источник
Вот решение, которое работает как для неперекрывающихся, так и для перекрывающихся случаев. Для пояснения: перекрывающаяся подстрока - это та, последний символ которой идентичен ее первому символу.
источник