Qu'entendez-vous par «nombre de sous-chaînes»? La position de la sous-chaîne? Combien de fois la sous-chaîne se produit-elle? Autre chose?
GreenMatt
2
S'agit-il d'un devoir? Si oui, veuillez ajouter la balise "devoirs" à votre question. De plus, votre question n'est pas très claire. Je répondrai à ce que vous semblez demander, mais je soupçonne que vous voulez vraiment découvrir autre chose.
@JimDeLaHunt Pour les enregistrements, il y a un exercice à ce sujet dans cscircles.cemc.uwaterloo.ca/8-remix - voir Exercice de codage: comptage des sous-chaînes .
Comme indiqué dans les commentaires, c'est la façon de procéder pour les occurrences qui ne se chevauchent pas . Si vous avez besoin de compter les occurrences qui se chevauchent, vous feriez mieux de vérifier les réponses à: " Python regex trouver toutes les correspondances qui se chevauchent? ", Ou tout simplement vérifier mon autre réponse ci-dessous.
Qu'en est-il de cela: ce "GCAAAAAG".count("AAA")qui donne 1, tandis que la bonne réponse est 3?
dessinateur
12
countest évidemment pour les correspondances qui ne se chevauchent pas - ce qui est le plus souvent ce que l'on veut faire. stackoverflow.com/questions/5616822/… traite des correspondances qui se chevauchent - mais une expression simple, mais coûteuse, est:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno
Est-il possible de compter / rechercher plusieurs mots à la fois? comme string.count (substring1, substring2)
Sushant Kulkarni
Non @SushantKulkarni Bien qu'il y ait une façon logique de faire une telle chose: string.count(substring1) + string.count(substring2). Mais gardez à l'esprit que ce n'est pas une méthode efficace s'il y a beaucoup de sous-chaînes car le comptage de chaque sous-chaîne nécessite une itération sur la chaîne principale.
Faheel
@SushantKulkarni ''.join([substring1, substring2]).count(pattern)est plus efficace que la solution suggérée ci-dessus. J'ai vérifié en utilisant timeit.
Enric Calabuig
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
Des explications supplémentaires amélioreraient votre réponse.
ryanyuyu
19
Selon ce que vous voulez vraiment dire, je vous propose les solutions suivantes:
Vous voulez dire une liste de sous-chaînes séparées par des espaces et vous voulez savoir quel est le numéro de position de la sous-chaîne parmi toutes les sous-chaînes:
s ='sub1 sub2 sub3'
s.split().index('sub2')>>>1
Vous voulez dire la position char de la sous-chaîne dans la chaîne:
s.find('sub2')>>>5
Vous voulez dire que les (non-chevauchement) compte d'apparition d'un su-bstring:
Je suppose que vous voulez dire s.find("su")et vous demandez pourquoi vous obtenez 0? Eh bien , c'est le premier indice de la sous-chaîne "su"dans s. Essayez "ub"et vous obtiendrez 1, essayez par exemple "z"et vous obtiendrez -1comme dans aucune sous-chaîne trouvée.
Don Question
Je veux dire que vous ne trouvez toujours que le premier index, mais pas tous les index, @ arun-kumar-khattri a donné la bonne réponse
obohovyk
Je suis soulagé que @ arun-kumar-khattri ait donné la "bonne" réponse que vous cherchiez. Vous devriez peut-être jeter un coup d'œil supplémentaire aux commentaires de jsbueno, parfois ils répondent à des questions que vous n'avez pas encore posées.
Don Question
Comme pour la troisième approche. BTW, je pense que vous devriez mentionner que cela fonctionne pour les cas qui ne se chevauchent pas.
Zeinab Abbasimazar
12
La meilleure façon de trouver une sous-chaîne qui se chevauchent dans une chaîne donnée est d'utiliser l'expression régulière python, elle trouvera toutes les correspondances qui se chevauchent en utilisant la bibliothèque d'expressions régulières. Voici comment le faire à gauche est la sous-chaîne et à droite vous fournirez la chaîne à faire correspondre
Petit conseil: au lieu de dire "Ça marche parce que je l'ai vérifié", vous pouvez inclure un exemple sur un service en ligne comme repl.it avec quelques exemples de données.
Valentin
1
merci pour ton commentaire Valentin! C'est ma première réponse ici. Je vais m'améliorer à partir de mes prochaines réponses.
Bharath Kumar R
10
Vous pouvez compter la fréquence de deux manières:
Utilisation de count()in str:
a.count(b)
Ou, vous pouvez utiliser:
len(a.split(b))-1
Où aest la chaîne et bla sous-chaîne dont la fréquence doit être calculée.
La meilleure méthode de réponse actuelle countne compte pas vraiment pour les occurrences qui se chevauchent et ne se soucie pas non plus des sous-chaînes vides. Par exemple:
>>> a ='caatatab'>>> b ='ata'>>>print(a.count(b))#overlapping1>>>print(a.count(''))#empty string9
La première réponse ne devrait 2pas être 1, si l'on considère les sous-chaînes qui se chevauchent. Quant à la deuxième réponse, il est préférable qu'une sous-chaîne vide renvoie 0 comme réponse.
avons-nous vraiment besoin de cette vérification si (string [j] == sub_string [0]):? n'est-il pas automatiquement couvert dans la condition if suivante?
AnandViswanathan89
AnandViswanathan89, Les deux si des conditions sont requises, si (chaîne [j] == chaîne_sous [0]) vérifie la correspondance de caractères initiale dans la chaîne principale, qui doit être effectuée pour tous les caractères de la chaîne principale et si (chaîne [ j: j + len2] == sub_string) effectue l'occurrence de la sous-chaîne. S'il s'agit de la première occurrence, la seconde si la condition aurait suffi.
Amith VV
4
La question n'est pas très claire, mais je vais répondre à ce que vous demandez, à première vue.
Une chaîne S, longue de L caractères, et où S [1] est le premier caractère de la chaîne et S [L] est le dernier caractère, a les sous-chaînes suivantes:
La chaîne nulle ''. Il y en a un.
Pour chaque valeur A de 1 à L, pour chaque valeur B de A à L, la chaîne S [A] .. S [B] (inclus). Il y a L + L-1 + L-2 + ... 1 de ces chaînes, pour un total de 0,5 * L * (L + 1).
Notez que le deuxième élément comprend S [1] .. S [L], c'est-à-dire la chaîne originale entière S.
Donc, il y a 0,5 * L * (L + 1) + 1 sous-chaînes dans une chaîne de longueur L. Rendez cette expression en Python, et vous avez le nombre de sous-chaînes présentes dans la chaîne.
Une façon est d'utiliser re.subn. Par exemple, pour compter le nombre d'occurrences de 'hello'dans n'importe quelle combinaison de cas, vous pouvez faire:
import re
_, count = re.subn(r'hello','', astring, flags=re.I)print('Found', count,'occurrences of "hello"')
Un mot pour moi, merci. @santosh, pourquoi ne pas accepter une réponse?
Mawg dit réintégrer Monica
2
Je garderai ma réponse acceptée comme étant "la manière simple et évidente de le faire" - mais cela ne couvre pas les événements qui se chevauchent. Les découvrir peut être fait naïvement, avec plusieurs vérifications des tranches - comme dans: sum ("GCAAAAAGH" [i:]. Commence par ("AAA") pour i dans la plage (len ("GCAAAAAGH")))
(ce qui donne 3) - cela peut être fait en utilisant des expressions régulières, comme on peut le voir sur regex Python trouver toutes les correspondances qui se chevauchent? - et cela peut aussi faire du golf à code fin - C'est mon compte "fait à la main" pour les superpositions de motifs dans une chaîne qui essaie de ne pas être extrêmement naïf (au moins, il ne crée pas de nouveaux objets de chaîne à chaque interaction):
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 diriez-vous d'un one-liner avec une compréhension de la liste? Techniquement ses 93 caractères de long, m'épargnent le purisme du PEP-8. La réponse regex.findall est la plus lisible si c'est un morceau de code de haut niveau. Si vous construisez quelque chose de bas niveau et ne voulez pas de dépendances, celui-ci est plutôt maigre et méchant. Je donne la réponse qui se chevauchent. Évidemment, utilisez simplement count comme la réponse la plus élevée s'il n'y a pas de chevauchement.
def count_substring(string, sub_string):return len([i for i in range(len(string))if string[i:i+len(sub_string)]== sub_string])
Si vous souhaitez connaître le nombre de sous-chaînes dans une chaîne; veuillez utiliser le code ci-dessous. Le code est facile à comprendre, c'est pourquoi j'ai sauté les commentaires. :)
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)
Peut-être pouvez-vous expliquer en quoi cette solution est différente de l'autre, y a-t-il un cas particulier qu'elle est capable de résoudre?
mpaskov
2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Donald Duck
0
import re
d =[m.start()for m in re.finditer(seaching, string)]print(d)
Cela trouve le nombre de fois que la sous-chaîne a été trouvée dans la chaîne et affiche l'index.
import re d = [m.start () for m in re.finditer (st3, st2)] #finding the number of times sub string found in the string and display index 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)
Risquer un downvote car 2+ autres ont déjà fourni cette solution. J'ai même voté pour l'un d'entre eux. Mais le mien est probablement le plus facile à comprendre pour les débutants.
Pour une chaîne simple avec délimitation d'espace, l'utilisation de Dict serait assez rapide, veuillez consulter le code ci-dessous
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')
La logique ci-dessous fonctionnera pour toutes les chaînes et caractères spéciaux
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"))
Bien que toutes les réponses soient appréciées, seules les réponses codées tendent à ne pas expliquer très bien le sujet. Veuillez ajouter du contexte.
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)
Veuillez envisager d'ajouter au moins quelques explications comme si cela répondait à la question
β.εηοιτ.βε
0
Voici une solution qui fonctionne à la fois pour les occurrences qui ne se chevauchent pas et qui se chevauchent. Pour clarifier: une sous-chaîne qui se chevauche est une sous-chaîne dont le dernier caractère est identique à son premier caractère.
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
Réponses:
string.count(substring)
, comme dans:Mettre à jour:
Comme indiqué dans les commentaires, c'est la façon de procéder pour les occurrences qui ne se chevauchent pas . Si vous avez besoin de compter les occurrences qui se chevauchent, vous feriez mieux de vérifier les réponses à: " Python regex trouver toutes les correspondances qui se chevauchent? ", Ou tout simplement vérifier mon autre réponse ci-dessous.
la source
"GCAAAAAG".count("AAA")
qui donne 1, tandis que la bonne réponse est 3?count
est évidemment pour les correspondances qui ne se chevauchent pas - ce qui est le plus souvent ce que l'on veut faire. stackoverflow.com/questions/5616822/… traite des correspondances qui se chevauchent - mais une expression simple, mais coûteuse, est:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)
. Mais gardez à l'esprit que ce n'est pas une méthode efficace s'il y a beaucoup de sous-chaînes car le comptage de chaque sous-chaîne nécessite une itération sur la chaîne principale.''.join([substring1, substring2]).count(pattern)
est plus efficace que la solution suggérée ci-dessus. J'ai vérifié en utilisant timeit.la source
Selon ce que vous voulez vraiment dire, je vous propose les solutions suivantes:
Vous voulez dire une liste de sous-chaînes séparées par des espaces et vous voulez savoir quel est le numéro de position de la sous-chaîne parmi toutes les sous-chaînes:
Vous voulez dire la position char de la sous-chaîne dans la chaîne:
Vous voulez dire que les (non-chevauchement) compte d'apparition d'un su-bstring:
la source
s.find("su")
et vous demandez pourquoi vous obtenez0
? Eh bien , c'est le premier indice de la sous-chaîne"su"
danss
. Essayez"ub"
et vous obtiendrez1
, essayez par exemple"z"
et vous obtiendrez-1
comme dans aucune sous-chaîne trouvée.La meilleure façon de trouver une sous-chaîne qui se chevauchent dans une chaîne donnée est d'utiliser l'expression régulière python, elle trouvera toutes les correspondances qui se chevauchent en utilisant la bibliothèque d'expressions régulières. Voici comment le faire à gauche est la sous-chaîne et à droite vous fournirez la chaîne à faire correspondre
la source
Pour trouver les occurrences qui se chevauchent d'une sous-chaîne dans une chaîne en Python 3, cet algorithme fera:
J'ai moi-même vérifié cet algorithme et cela a fonctionné.
la source
Vous pouvez compter la fréquence de deux manières:
Utilisation de
count()
instr
:a.count(b)
Ou, vous pouvez utiliser:
len(a.split(b))-1
Où
a
est la chaîne etb
la sous-chaîne dont la fréquence doit être calculée.la source
La meilleure méthode de réponse actuelle
count
ne compte pas vraiment pour les occurrences qui se chevauchent et ne se soucie pas non plus des sous-chaînes vides. Par exemple:La première réponse ne devrait
2
pas être1
, si l'on considère les sous-chaînes qui se chevauchent. Quant à la deuxième réponse, il est préférable qu'une sous-chaîne vide renvoie 0 comme réponse.Le code suivant s'occupe de ces choses.
Maintenant, quand nous l'exécutons:
la source
Scénario 1: occurrence d'un mot dans une phrase. par exemple:
str1 = "This is an example and is easy"
. L'occurrence du mot "est". laissestr2 = "is"
Scénario 2: occurrence du motif dans une phrase.
Merci!
la source
La question n'est pas très claire, mais je vais répondre à ce que vous demandez, à première vue.
Une chaîne S, longue de L caractères, et où S [1] est le premier caractère de la chaîne et S [L] est le dernier caractère, a les sous-chaînes suivantes:
Donc, il y a 0,5 * L * (L + 1) + 1 sous-chaînes dans une chaîne de longueur L. Rendez cette expression en Python, et vous avez le nombre de sous-chaînes présentes dans la chaîne.
la source
Une façon est d'utiliser
re.subn
. Par exemple, pour compter le nombre d'occurrences de'hello'
dans n'importe quelle combinaison de cas, vous pouvez faire:la source
Je garderai ma réponse acceptée comme étant "la manière simple et évidente de le faire" - mais cela ne couvre pas les événements qui se chevauchent. Les découvrir peut être fait naïvement, avec plusieurs vérifications des tranches - comme dans: sum ("GCAAAAAGH" [i:]. Commence par ("AAA") pour i dans la plage (len ("GCAAAAAGH")))
(ce qui donne 3) - cela peut être fait en utilisant des expressions régulières, comme on peut le voir sur regex Python trouver toutes les correspondances qui se chevauchent? - et cela peut aussi faire du golf à code fin - C'est mon compte "fait à la main" pour les superpositions de motifs dans une chaîne qui essaie de ne pas être extrêmement naïf (au moins, il ne crée pas de nouveaux objets de chaîne à chaque interaction):
la source
Occurrences qui se chevauchent:
Résultats:
la source
Pour le nombre de chevauchements, nous pouvons utiliser:
Pour les cas sans chevauchement, nous pouvons utiliser la fonction count ():
la source
Que diriez-vous d'un one-liner avec une compréhension de la liste? Techniquement ses 93 caractères de long, m'épargnent le purisme du PEP-8. La réponse regex.findall est la plus lisible si c'est un morceau de code de haut niveau. Si vous construisez quelque chose de bas niveau et ne voulez pas de dépendances, celui-ci est plutôt maigre et méchant. Je donne la réponse qui se chevauchent. Évidemment, utilisez simplement count comme la réponse la plus élevée s'il n'y a pas de chevauchement.
la source
Si vous souhaitez compter toute la sous-chaîne (y compris les chevauchements), utilisez cette méthode.
la source
Si vous souhaitez connaître le nombre de sous-chaînes dans une chaîne; veuillez utiliser le code ci-dessous. Le code est facile à comprendre, c'est pourquoi j'ai sauté les commentaires. :)
la source
Je ne sais pas si c'est déjà quelque chose à regarder, mais j'ai pensé à cela comme une solution pour un mot qui est «jetable»:
Où mot est le mot que vous recherchez et terme est le terme que vous recherchez
la source
la source
Cela trouve le nombre de fois que la sous-chaîne a été trouvée dans la chaîne et affiche l'index.
la source
la source
Risquer un downvote car 2+ autres ont déjà fourni cette solution. J'ai même voté pour l'un d'entre eux. Mais le mien est probablement le plus facile à comprendre pour les débutants.
la source
Pour une chaîne simple avec délimitation d'espace, l'utilisation de Dict serait assez rapide, veuillez consulter le code ci-dessous
la source
Vous pouvez utiliser la
startswith
méthode:la source
La logique ci-dessous fonctionnera pour toutes les chaînes et caractères spéciaux
la source
Voici la solution en Python 3 et insensible à la casse:
la source
la source
la source
la source
Cela fait une liste de toutes les occurrences (qui se chevauchent également) dans la chaîne et les compte
Exemple:
créera cette liste mais n'enregistrera que les valeurs BOLD :
[ab, bc , ca, ab, bc , cd]
qui reviendra:
la source
Voici une solution qui fonctionne à la fois pour les occurrences qui ne se chevauchent pas et qui se chevauchent. Pour clarifier: une sous-chaîne qui se chevauche est une sous-chaîne dont le dernier caractère est identique à son premier caractère.
la source