Подсчитать количество вхождений данной подстроки в строку - PullRequest
165 голосов
/ 17 января 2012

Как подсчитать, сколько раз данная подстрока присутствует в строке в Python?

Например:

>>> 'foo bar foo'.numberOfOccurrences('foo')
2

Ответы [ 24 ]

2 голосов
/ 26 июня 2015

Я оставлю свой принятый ответ как «простой и очевидный способ сделать это» - однако это не распространяется на перекрывающиеся события.Выяснить это можно наивно, с многократной проверкой срезов - как в: sum ("GCAAAAAGH" [i:]. Начинается с ("AAA") для i в диапазоне (len ("GCAAAAAGH")))

(что приводит к 3) - это может быть сделано с помощью трюка с использованием регулярных выражений, как можно увидеть на Регулярное выражение Python находит все перекрывающиеся совпадения? - и это также может быть полезно для игры в тонкий код - Этомой «ручной» счетчик для перекрывающихся вхождений шаблонов в строке, которая пытается быть не наивной (по крайней мере, не создает новые строковые объекты при каждом взаимодействии):

def find_matches_overlapping(text, pattern):
    lpat = len(pattern) - 1
    matches = []
    text = array("u", text)
    pattern = array("u", pattern)
    indexes = {}
    for i in range(len(text) - lpat):
        if text[i] == pattern[0]:
            indexes[i] = -1
        for index, counter in list(indexes.items()):
            counter += 1
            if text[i] == pattern[counter]:
                if counter == lpat:
                    matches.append(index)
                    del indexes[index]
                else:
                    indexes[index] = counter
            else:
                del indexes[index]
    return matches

def count_matches(text, pattern):
    return len(find_matches_overlapping(text, pattern))
2 голосов
/ 18 декабря 2017

Для подсчета с перекрытием мы можем использовать:

def count_substring(string, sub_string):
    count=0
    beg=0
    while(string.find(sub_string,beg)!=-1) :
        count=count+1
        beg=string.find(sub_string,beg)
        beg=beg+1
    return count

Для случая без перекрытия мы можем использовать функцию count ():

string.count(sub_string)
1 голос
/ 29 декабря 2018

Сценарий 1: вхождение слова в предложение. например: str1 = "This is an example and is easy". Появление слова «есть». позволяет str2 = "is"

count = str1.count(str2)

Сценарий 2: Вхождение шаблона в предложении.

string = "ABCDCDC"
substring = "CDC"

def count_substring(string,sub_string):
len1 = len(string)
len2 = len(sub_string)
j =0
counter = 0
while(j < len1):
    if(string[j] == sub_string[0]):
        if(string[j:j+len2] == sub_string):
            counter += 1
    j += 1

return counter

Спасибо!

1 голос
/ 05 августа 2018

Как насчет строки с пониманием списка?Технически его 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])
1 голос
/ 22 августа 2017

Если вы хотите узнать количество подстрок внутри любой строки;пожалуйста, используйте ниже код.Код легко понять, поэтому я пропустил комментарии.:)

string=raw_input()
sub_string=raw_input()
start=0
answer=0
length=len(string)
index=string.find(sub_string,start,length)
while index<>-1:
    start=index+1
    answer=answer+1
    index=string.find(sub_string,start,length)
print answer
0 голосов
/ 18 июля 2019

Вот решение в Python 3 и без учета регистра:

s = 'foo bar foo'.upper()
sb = 'foo'.upper()
results = 0
sub_len = len(sb)
for i in range(len(s)):
    if s[i:i+sub_len] == sb:
        results += 1
print(results)
0 голосов
/ 09 июня 2019

Для простой строки с разделителем пробелов использование 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 not in [sbstr]:
            continue
        try:
            x[st]+=1
        except KeyError:
            x[st] = 1
    return x[sbstr]

s = 'foo bar foo test one two three foo bar'
getStringCount(s,'foo')
0 голосов
/ 16 декабря 2018

Вы можете использовать метод startswith:

def count_substring(string, sub_string):
    x = 0
    for i in range(len(string)):
        if string[i:].startswith(sub_string):
            x += 1
    return x
0 голосов
/ 16 ноября 2018

Риск понизить голос, потому что 2+ других уже предоставили это решение. Я даже проголосовал за одного из них. Но, пожалуй, новичкам легче всего понять.

def count_substring(string, sub_string):
    slen  = len(string)
    sslen = len(sub_string)
    range_s = slen - sslen + 1
    count = 0
    for i in range(range_s):
        if (string[i:i+sslen] == sub_string):
            count += 1
    return count
0 голосов
/ 11 августа 2018

Логика ниже будет работать для всех строковых и специальных символов

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...