O que você quer dizer com "número de substring"? A posição da substring? Quantas vezes a substring ocorre? Algo mais?
GreenMatt
2
Esta é uma tarefa de casa? Em caso afirmativo, adicione a tag "lição de casa" à sua pergunta. Além disso, sua pergunta não é muito clara. Responderei o que você parece estar perguntando, mas desconfio que realmente queira descobrir outra coisa.
@JimDeLaHunt Para os registros, há um exercício sobre isso em cscircles.cemc.uwaterloo.ca/8-remix - consulte Exercício de codificação: contagem de substring .
Conforme apontado nos comentários, esta é a maneira de fazer isso para ocorrências não sobrepostas . Se você precisar contar ocorrências sobrepostas, é melhor verificar as respostas em: "O regex do Python encontra todas as correspondências sobrepostas? " Ou apenas verificar minha outra resposta abaixo.
O que acontece com isso: "GCAAAAAG".count("AAA")que fornece 1, enquanto a resposta correta é 3?
cartunista
12
counté obviamente para correspondências sem sobreposição - o que geralmente é o que se deseja fazer. stackoverflow.com/questions/5616822/... ofertas com sobreposição de partidas - mas um simples, se caros, a expressão é:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno
É possível contar / pesquisar várias palavras ao mesmo tempo? como string.count (substring1, substring2)
Sushant Kulkarni
@SushantKulkarni Não. Embora não há uma maneira lógica de fazer tal coisa a: string.count(substring1) + string.count(substring2). Mas lembre-se de que este não é um método eficiente se houver muitas substrings, pois contar cada substring requer uma iteração na string principal.
Faheel 22/11
A ação do @SushantKulkarni ''.join([substring1, substring2]).count(pattern)é mais eficiente do que a solução sugerida acima. Eu verifiquei usando timeit.
Enric Calabuig
23
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
Eu acho que você quer dizer s.find("su")e se pergunta por que você conseguiu 0? Bem, este é o primeiro índice da sub-string"su" em s. Tente "ub"e você obterá 1, tente por exemplo, "z"e você obterá -1como em nenhuma substring encontrada.
Don Pergunta
Quer dizer que você sempre encontrar apenas o primeiro índice, mas não todos os índices, @ arun-kumar-Khattri gived resposta correta
obohovyk
Estou aliviado que @ arun-kumar-khattri deu a resposta "correta" que você estava procurando. Talvez você deva dar uma olhada adicional nos comentários de jsbueno, às vezes eles respondem a perguntas que você ainda não fez.
Don Pergunta
Como na terceira abordagem. BTW, acho que você deve mencionar que funciona para casos sem sobreposição.
Zeinab Abbasimazar
12
A melhor maneira de encontrar uma sub-string sobreposta em uma determinada string é usar a expressão regular python, que encontrará toda a correspondência sobreposta usando a biblioteca de expressões regulares. Aqui está como fazer isso à esquerda é a substring e à direita você fornecerá a string para corresponder
Dica pequena: em vez de dizer "Funciona porque eu verifiquei", você pode incluir um exemplo em um serviço online como repl.it com alguns dados de amostra.
Valentin
1
obrigado pelo seu comentário Valentin! É a minha primeira resposta aqui. Vou me aperfeiçoar com minhas próximas respostas.
precisa
10
Você pode contar a frequência de duas maneiras:
Usando o count()em str:
a.count(b)
Ou você pode usar:
len(a.split(b))-1
Onde aé a string e ba substring cuja frequência deve ser calculada.
A melhor resposta atual que envolve o método countrealmente não conta para ocorrências sobrepostas e também não se importa com sub-strings vazias. Por exemplo:
>>> a ='caatatab'>>> b ='ata'>>>print(a.count(b))#overlapping1>>>print(a.count(''))#empty string9
A primeira resposta 2não deve ser 1, se considerarmos as substrings sobrepostas. Quanto à segunda resposta, é melhor se uma sub-string vazia retornar 0 como a resposta.
realmente precisamos dessa verificação se (string [j] == sub_string [0]):? não é coberto automaticamente na condição if subsequente?
AnandViswanathan89 13/02/19
AnandViswanathan89, Both se forem necessárias condições, if (string [j] == sub_string [0]) verifica a correspondência de caracteres inicial na string principal, que deve ser executada para todos os caracteres da string principal e if (string [ j: j + len2] == sub_string) executa a ocorrência de substring. Se for para a primeira ocorrência, então a segunda, se a condição for suficiente.
Amith VV 14/02/19
4
A pergunta não é muito clara, mas responderei o que você está perguntando, na superfície.
Uma sequência S, que tem L caracteres e onde S [1] é o primeiro caractere da sequência e S [L] é o último caractere, possui as seguintes substrings:
A cadeia nula ''. Existe um desses.
Para todo valor A de 1 a L, para todo valor B de A a L, a sequência S [A] .. S [B] (inclusive). Existem L + L-1 + L-2 + ... 1 dessas cadeias, para um total de 0,5 * L * (L + 1).
Observe que o segundo item inclui S [1] .. S [L], ou seja, toda a sequência original S.
Portanto, existem 0,5 * L * (L + 1) + 1 substrings dentro de uma cadeia de comprimento L. Renderize essa expressão em Python e você terá o número de substrings presentes na cadeia.
Palavra para mim, obrigado. @antosh, por que não aceitar uma resposta?
Mawg diz restabelecer Monica
2
Manterei minha resposta aceita como a "maneira simples e óbvia de fazer isso" - no entanto, isso não cobre ocorrências sobrepostas. A descoberta dessas informações pode ser feita de forma ingênua, com várias verificações das fatias - como em: sum ("GCAAAAAGH" [i:]. Começa com ("AAA") para i no intervalo (len ("GCAAAAAGH")))
(que produz 3) - isso pode ser feito usando truques com expressões regulares, como pode ser visto no regex do Python, encontrar todas as correspondências sobrepostas? - e também pode resultar em golfe com código fino - Essa é a minha contagem "feita à mão" para ocorrência de sobreposição de padrões em uma string que tenta não ser extremamente ingênua (pelo menos não cria novos objetos de string em cada interação):
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')
Que tal um one-liner com uma lista de compreensão? Tecnicamente, com 93 caracteres, poupe-me o purismo de PEP-8. A resposta regex.findall é a mais legível se for um trecho de código de alto nível. Se você está construindo algo de baixo nível e não quer dependências, este é bastante enxuto e mesquinho. Estou dando a resposta sobreposta. Obviamente, basta usar count como a resposta de pontuação mais alta se não houver sobreposição.
def count_substring(string, sub_string):return len([i for i in range(len(string))if string[i:i+len(sub_string)]== sub_string])
Se você deseja descobrir a contagem de substring dentro de qualquer string; use o código abaixo. É fácil entender o código, por isso pulei os comentários. :)
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)
Talvez você possa explicar como essa solução é diferente da outra. Existe um caso especial que é capaz de resolver?
precisa saber é
2
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
Donald Duck
0
import re
d =[m.start()for m in re.finditer(seaching, string)]print(d)
Ele encontra o número de vezes que a sub-string é encontrada na string e exibe o índice.
import re d = [m.start () para m no re.finditer (st3, st2)] #finding o número de vezes que a sub string encontrada na string e exibe o índice print (d)
Bhaskar Reddi K
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)
Arriscar um voto negativo, porque mais de 2 pessoas já forneceram esta solução. Eu até votei em um deles. Mas o meu é provavelmente o mais fácil para os novatos entenderem.
Para uma string simples com delimitação de espaço, o uso do Dict seria bastante rápido, veja o código abaixo
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')
A lógica abaixo funcionará para todas as cadeias e caracteres especiais
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"))
Embora todas as respostas sejam apreciadas, as respostas somente em código tendem a não explicar muito bem o assunto. Por favor, adicione algum contexto.
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)
Por favor, considere adicionar pelo menos alguma explicação, como se essa resposta à pergunta
fosse
0
Aqui está uma solução que funciona para ocorrências não sobrepostas e sobrepostas. Para esclarecer: uma substring sobreposta é aquela cujo último caractere é idêntico ao seu primeiro caractere.
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
Respostas:
string.count(substring)
, como em:Atualizar:
Conforme apontado nos comentários, esta é a maneira de fazer isso para ocorrências não sobrepostas . Se você precisar contar ocorrências sobrepostas, é melhor verificar as respostas em: "O regex do Python encontra todas as correspondências sobrepostas? " Ou apenas verificar minha outra resposta abaixo.
fonte
"GCAAAAAG".count("AAA")
que fornece 1, enquanto a resposta correta é 3?count
é obviamente para correspondências sem sobreposição - o que geralmente é o que se deseja fazer. stackoverflow.com/questions/5616822/... ofertas com sobreposição de partidas - mas um simples, se caros, a expressão é:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)
. Mas lembre-se de que este não é um método eficiente se houver muitas substrings, pois contar cada substring requer uma iteração na string principal.''.join([substring1, substring2]).count(pattern)
é mais eficiente do que a solução sugerida acima. Eu verifiquei usando timeit.fonte
Dependendo do que você realmente quer dizer, proponho as seguintes soluções:
Você quer dizer uma lista de sub-strings separadas por espaço e deseja saber qual é o número de posição da sub-string entre todas as sub-strings:
Você quer dizer a posição de char da sub-string na string:
Você quer dizer as contagens (sem sobreposição) de aparência de uma sub-string:
fonte
s.find("su")
e se pergunta por que você conseguiu0
? Bem, este é o primeiro índice da sub-string"su"
ems
. Tente"ub"
e você obterá1
, tente por exemplo,"z"
e você obterá-1
como em nenhuma substring encontrada.A melhor maneira de encontrar uma sub-string sobreposta em uma determinada string é usar a expressão regular python, que encontrará toda a correspondência sobreposta usando a biblioteca de expressões regulares. Aqui está como fazer isso à esquerda é a substring e à direita você fornecerá a string para corresponder
fonte
Para encontrar ocorrências sobrepostas de uma substring em uma string no Python 3, esse algoritmo fará:
Eu próprio verifiquei este algoritmo e funcionou.
fonte
Você pode contar a frequência de duas maneiras:
Usando o
count()
emstr
:a.count(b)
Ou você pode usar:
len(a.split(b))-1
Onde
a
é a string eb
a substring cuja frequência deve ser calculada.fonte
A melhor resposta atual que envolve o método
count
realmente não conta para ocorrências sobrepostas e também não se importa com sub-strings vazias. Por exemplo:A primeira resposta
2
não deve ser1
, se considerarmos as substrings sobrepostas. Quanto à segunda resposta, é melhor se uma sub-string vazia retornar 0 como a resposta.O código a seguir cuida dessas coisas.
Agora, quando executamos:
fonte
Cenário 1: Ocorrência de uma palavra em uma frase. por exemplo:
str1 = "This is an example and is easy"
. A ocorrência da palavra "é". deixastr2 = "is"
Cenário 2: Ocorrência de padrão em uma frase.
Obrigado!
fonte
A pergunta não é muito clara, mas responderei o que você está perguntando, na superfície.
Uma sequência S, que tem L caracteres e onde S [1] é o primeiro caractere da sequência e S [L] é o último caractere, possui as seguintes substrings:
Portanto, existem 0,5 * L * (L + 1) + 1 substrings dentro de uma cadeia de comprimento L. Renderize essa expressão em Python e você terá o número de substrings presentes na cadeia.
fonte
Uma maneira é usar
re.subn
. Por exemplo, para contar o número de ocorrências de'hello'
qualquer combinação de casos, você pode:fonte
Manterei minha resposta aceita como a "maneira simples e óbvia de fazer isso" - no entanto, isso não cobre ocorrências sobrepostas. A descoberta dessas informações pode ser feita de forma ingênua, com várias verificações das fatias - como em: sum ("GCAAAAAGH" [i:]. Começa com ("AAA") para i no intervalo (len ("GCAAAAAGH")))
(que produz 3) - isso pode ser feito usando truques com expressões regulares, como pode ser visto no regex do Python, encontrar todas as correspondências sobrepostas? - e também pode resultar em golfe com código fino - Essa é a minha contagem "feita à mão" para ocorrência de sobreposição de padrões em uma string que tenta não ser extremamente ingênua (pelo menos não cria novos objetos de string em cada interação):
fonte
Ocorrências sobrepostas:
Resultados:
fonte
Para contagem sobreposta, podemos usar use:
Para casos sem sobreposição, podemos usar a função count ():
fonte
Que tal um one-liner com uma lista de compreensão? Tecnicamente, com 93 caracteres, poupe-me o purismo de PEP-8. A resposta regex.findall é a mais legível se for um trecho de código de alto nível. Se você está construindo algo de baixo nível e não quer dependências, este é bastante enxuto e mesquinho. Estou dando a resposta sobreposta. Obviamente, basta usar count como a resposta de pontuação mais alta se não houver sobreposição.
fonte
Se você quiser contar todas as sub-strings (incluindo sobrepostas), use este método.
fonte
Se você deseja descobrir a contagem de substring dentro de qualquer string; use o código abaixo. É fácil entender o código, por isso pulei os comentários. :)
fonte
Não tenho certeza se isso já é algo analisado, mas pensei nisso como uma solução para uma palavra que é 'descartável':
Onde palavra é a palavra que você está pesquisando e termo é o termo que você está procurando
fonte
fonte
Ele encontra o número de vezes que a sub-string é encontrada na string e exibe o índice.
fonte
fonte
Arriscar um voto negativo, porque mais de 2 pessoas já forneceram esta solução. Eu até votei em um deles. Mas o meu é provavelmente o mais fácil para os novatos entenderem.
fonte
Para uma string simples com delimitação de espaço, o uso do Dict seria bastante rápido, veja o código abaixo
fonte
Você pode usar o
startswith
método:fonte
A lógica abaixo funcionará para todas as cadeias e caracteres especiais
fonte
Aqui está a solução no Python 3 e não diferencia maiúsculas de minúsculas:
fonte
fonte
fonte
fonte
Isso faz uma lista de todas as ocorrências (também sobrepostas) na string e as conta
Exemplo:
criará esta lista, mas salvará apenas os valores BOLD :
[ab, bc , ca, ab, bc , cd]
que retornará:
fonte
Aqui está uma solução que funciona para ocorrências não sobrepostas e sobrepostas. Para esclarecer: uma substring sobreposta é aquela cujo último caractere é idêntico ao seu primeiro caractere.
fonte