web-dev-qa-db-fra.com

Détermination du nombre de fois qu'une sous-chaîne se produit dans une chaîne en Python

J'essaie de savoir combien de fois une chaîne se produit dans une chaîne. Par exemple:

nStr = '000123000123'

Disons que la chaîne que je veux trouver est 123. Évidemment, cela se produit deux fois dans nStr, mais je ne parviens pas à implémenter cette logique dans Python. Ce que j'ai en ce moment:

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

La réponse devrait être de 2. Je suis coincé dans une boucle infinie pour le moment.

Je viens de me rendre compte que compter est une meilleure façon de le faire, mais par curiosité, est-ce que quelqu'un voit un moyen de le faire similaire à ce que j'ai déjà?

45
user1294377

Utilisez str.count :

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

Une version de travail 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)
69
Ashwini Chaudhary

Le problème avec count() et les méthodes présentées ici est le cas des 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 pouvez essayer quelque chose comme ceci:

def my_count(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

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

Je ne sais pas s'il existe un meilleur moyen de le faire, mais nous affichons simplement pour clarifier le fonctionnement de count().

18
João Pesce
import re

pattern = '123'

n =re.findall(pattern, string)

On peut dire que la sous-chaîne 'pattern' apparaît len ​​(n) fois dans 'string'.

5
Prasanna

Si vous cherchez 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)

Cela donnera 3 parce que: [azc (bob) obegghaklbob] [azcbo (bob) egghaklbob] [azcbobobegghakl (bob)]

0
TawabG
def count_substring(string, substring):
         c=0
         l=len(sub_string)
         for i in range(len(string)):
                 if string [i:i+l]==sub_string:
                          c=c+1
         return c
string=input().strip()
sub_string=input().strip()

count= count_substring(string,sub_string)
print(count)
0
Priyanka Kumari

string.count (sous-chaîne) n'est pas utile en cas de chevauchement.

Mon approche:

def count_substring(string, sub_string):

    length = len(string)
    counter = 0
    for i in range(length):
        for j in range(length):
            if string[i:j+1] == sub_string:
                counter +=1
    return counter
0
gaurav parashar

Vous ne changez pas a à chaque boucle. Vous devriez mettre:

a += nStr[a:].find(pattern)+1

...au lieu de:

a = nStr[a:].find(pattern)+1
0
N Prad

Comme mentionné par @ João Pesce et @gaurav, count() n'est pas utile dans le cas de chevauchement de sous-chaînes, essayez ceci ...

def count_substring(string, sub_string):
    c=0
    for i in range(len(string)):
        if(string[i:i+len(sub_string)]==sub_string):
            c = c+1
    return c
0
Aditya Patnaik