87 votes

Déterminer le nombre d'occurrences d'une sous-chaîne dans une chaîne de caractères en Python

J'essaie de savoir combien de fois une chaîne de caractères apparaît dans une autre chaîne. Par exemple :

nStr = '000123000123'

Disons que la chaîne de caractères que je veux trouver est 123. Il est évident qu'elle apparaît deux fois dans nStr, mais j'ai du mal à mettre en œuvre cette logique dans Python. Ce que j'ai pour l'instant :

pattern = '123'
count = a = 0
while pattern in nStr[a:]:
    a = nStr[a:].find(pattern)+1
    count += 1
return count

La réponse qu'il devrait renvoyer est 2. Je suis coincé dans une boucle infinie pour le moment.

Je viens d'apprendre que le comptage est une bien meilleure façon de procéder, mais par curiosité, quelqu'un voit-il une façon de procéder similaire à ce que j'ai déjà obtenu ?

128voto

Ashwini Chaudhary Points 94431

Utilisation str.count :

>>> nStr = '000123000123'
>>> nStr.count('123')
2

Une version fonctionnelle de votre code :

nStr = '000123000123'
pattern = '123'
count = 0
flag = True
start = 0

while flag:
    a = nStr.find(pattern, start)  # find() returns -1 if the word is not found, 
    #start i the starting index from the search starts(default value is 0)
    if a == -1:          #if pattern not found set flag to False
        flag = False
    else:               # if word is found increase count and set starting index to a+1
        count += 1        
        start = a + 1
print(count)

36voto

João Pesce Points 631

Le problème avec count() et les autres méthodes présentées ici, c'est dans le cas de sous-chaînes qui se chevauchent.

Par exemple : "aaaaaa".count("aaa") renvoie 2

Si vous voulez qu'il renvoie 4 [ (aaa)aaa, a(aaa)aa, aa(aaa)a, aaa(aaa) Vous pourriez essayer quelque chose comme ceci :

def count_substrings(string, substring):
    string_size = len(string)
    substring_size = len(substring)
    count = 0
    for i in xrange(0,string_size-substring_size+1):
        if string[i:i+substring_size] == substring:
            count+=1
    return count

count_substrings("aaaaaa", "aaa")
# 4

Je ne sais pas s'il existe une manière plus efficace de procéder, mais j'espère que cela clarifie la façon de procéder. count() œuvre.

7voto

Prasanna Points 83
import re

pattern = '123'

n =re.findall(pattern, string)

Nous pouvons dire que la chaîne de caractères "motif" apparaît len(n) fois dans "chaîne".

4voto

TawabG Points 411

Au cas où vous chercheriez comment résoudre ce problème pour les cas de chevauchement.

s = 'azcbobobegghaklbob'
str = 'bob'
results = 0
sub_len = len(str) 
for i in range(len(s)):
    if s[i:i+sub_len] == str: 
        results += 1
print (results)

Il en résultera 3 car : [azc(bob)obegghaklbob] [azcbo(bob)egghaklbob] [azcbobobegghakl(bob)].

1voto

muramena Points 11

Je suis assez novice, mais je pense que c'est une bonne solution ? peut-être ?

def count_substring(str, sub_str):
    count = 0
    for i, c in enumerate(str):
        if sub_str == str[i:i+2]:
            count += 1
    return count

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X