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

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

Например:

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

Ответы [ 24 ]

287 голосов
/ 17 января 2012

string.count(substring), как в:

>>> "abcdabcva".count("ab")
2

обновление : как указано в комментариях, это способ сделать это для не перекрывающихся вхождения.Если вам нужно сосчитать перекрывающиеся вхождения, вам лучше проверить ответы по адресу: " регулярное выражение Python находит все перекрывающиеся совпадения? ", или просто проверьте мой другой ответ ниже.

20 голосов
/ 16 июня 2015
s = 'arunununghhjj'
sb = 'nun'
results = 0
sub_len = len(sb)
for i in range(len(s)):
    if s[i:i+sub_len] == sb:
        results += 1
print results
18 голосов
/ 17 января 2012

В зависимости от того, что вы на самом деле имеете в виду, я предлагаю следующие решения:

  1. Вы имеете в виду список разделенных пробелами подстрок и хотите знать, что такое номер позиции подстроки средивсе подстроки:

    s = 'sub1 sub2 sub3'
    s.split().index('sub2')
    >>> 1
    
  2. Вы имеете в виду символьную позицию подстроки в строке:

    s.find('sub2')
    >>> 5
    
  3. Вы имеете в виду (не перекрывающиеся) число появления su-bstring:

    s.count('sub2')
    >>> 1
    s.count('sub')
    >>> 3
    
10 голосов
/ 09 сентября 2017

Вы можете посчитать частоту двумя способами:

  1. Использование count() in str:

    a.count(b)

  2. Или вы можете использовать:

    len(a.split(b))-1

Где a - строка, а b - подстрока, частота которой рассчитывается.

9 голосов
/ 15 июля 2017

Чтобы найти перекрывающиеся вхождения подстроки в строку в Python 3, этот алгоритм будет делать:

def count_substring(string,sub_string):
    l=len(sub_string)
    count=0
    for i in range(len(string)-len(sub_string)+1):
        if(string[i:i+len(sub_string)] == sub_string ):      
            count+=1
    return count  

Я сам проверил этот алгоритм, и он работал.

9 голосов
/ 20 февраля 2018

Лучший способ найти перекрывающуюся подстроку в данной строке - это использовать регулярное выражение python, которое найдет все совпадающие совпадения, используя библиотеку регулярных выражений.Вот как это сделать, левая подстрока и справа вы предоставите строку для соответствия

print len(re.findall('(?=aa)','caaaab'))
3
6 голосов
/ 13 марта 2017

Текущий лучший ответ, включающий метод count, на самом деле не учитывается для перекрывающихся вхождений и не заботится о пустых подстроках.Например:

>>> a = 'caatatab'
>>> b = 'ata'
>>> print(a.count(b)) #overlapping
1
>>>print(a.count('')) #empty string
9

Первый ответ должен быть 2, а не 1, если мы рассмотрим перекрывающиеся подстроки.Что касается второго ответа, то лучше, если пустая подстрока возвращает 0 как asnwer.

Следующий код заботится об этих вещах.

def num_of_patterns(astr,pattern):
    astr, pattern = astr.strip(), pattern.strip()
    if pattern == '': return 0

    ind, count, start_flag = 0,0,0
    while True:
        try:
            if start_flag == 0:
                ind = astr.index(pattern)
                start_flag = 1
            else:
                ind += 1 + astr[ind+1:].index(pattern)
            count += 1
        except:
            break
    return count

Теперь, когда мы его запустим:

>>>num_of_patterns('caatatab', 'ata') #overlapping
2
>>>num_of_patterns('caatatab', '') #empty string
0
>>>num_of_patterns('abcdabcva','ab') #normal
2
4 голосов
/ 02 марта 2018

Одним из способов является использование re.subn.Например, чтобы подсчитать количество вхождений 'hello' в любом сочетании случаев, вы можете сделать:

import re
_, count = re.subn(r'hello', '', astring, flags=re.I)
print('Found', count, 'occurrences of "hello"')
4 голосов
/ 17 января 2012

Вопрос не очень ясен, но я отвечу, что вы, на поверхности, спрашиваете.

Строка S, длина которой составляет L символов, и где S [1] - этопервый символ строки, а S [L] - последний символ, имеет следующие подстроки:

  • Нулевая строка ''.Есть один из них.
  • Для каждого значения A от 1 до L, для каждого значения B от A до L строка S [A] .. S [B] (включительно).Есть L + L-1 + L-2 + ... 1 из этих строк, всего 0,5 * L * (L + 1).
  • Обратите внимание, что второй элемент включает в себя S [1] .. S [L], то есть всю исходную строку S.

Итак, есть 0,5 * L * (L +1) + 1 подстрока в строке длины L. Отобразите это выражение в Python, и у вас будет количество подстрок, присутствующих в строке.

2 голосов
/ 12 июля 2015

перекрывающиеся вхождения:

def olpcount(string,pattern,case_sensitive=True):
    if case_sensitive != True:
        string  = string.lower()
        pattern = pattern.lower()
    l = len(pattern)
    ct = 0
    for c in range(0,len(string)):
        if string[c:c+l] == pattern:
            ct += 1
    return ct

test = 'my maaather lies over the oceaaan'
print test
print olpcount(test,'a')
print olpcount(test,'aa')
print olpcount(test,'aaa')

Результаты:

my maaather lies over the oceaaan
6
4
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...