Count number of occurrences of a given substring in a string

后端 未结 30 1657
不思量自难忘°
不思量自难忘° 2020-11-22 13:58

How can I count the number of times a given substring is present within a string in Python?

For example:

>>> \'foo bar foo\'.numberOfOccurre         


        
相关标签:
30条回答
  • 2020-11-22 14:38

    If you want to count all the sub-string (including overlapped) then use this method.

    import re
    def count_substring(string, sub_string):
        regex = '(?='+sub_string+')'
        # print(regex)
        return len(re.findall(regex,string))
    
    0 讨论(0)
  • 2020-11-22 14:39

    Here's the solution in Python 3 and case insensitive:

    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 讨论(0)
  • 2020-11-22 14:40

    The current best answer involving method count doesn't really count for overlapping occurrences and doesn't care about empty sub-strings as well. For example:

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

    The first answer should be 2 not 1, if we consider the overlapping substrings. As for the second answer it's better if an empty sub-string returns 0 as the asnwer.

    The following code takes care of these things.

    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
    

    Now when we run it:

    >>>num_of_patterns('caatatab', 'ata') #overlapping
    2
    >>>num_of_patterns('caatatab', '') #empty string
    0
    >>>num_of_patterns('abcdabcva','ab') #normal
    2
    
    0 讨论(0)
  • 2020-11-22 14:42

    Overlapping occurences:

    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')
    

    Results:

    my maaather lies over the oceaaan
    6
    4
    2
    
    0 讨论(0)
  • 2020-11-22 14:44

    Depending what you really mean, I propose the following solutions:

    1. You mean a list of space separated sub-strings and want to know what is the sub-string position number among all sub-strings:

      s = 'sub1 sub2 sub3'
      s.split().index('sub2')
      >>> 1
      
    2. You mean the char-position of the sub-string in the string:

      s.find('sub2')
      >>> 5
      
    3. You mean the (non-overlapping) counts of appearance of a su-bstring:

      s.count('sub2')
      >>> 1
      s.count('sub')
      >>> 3
      
    0 讨论(0)
  • 2020-11-22 14:45
               def count_substring(string, sub_string):
                   k=len(string)
                   m=len(sub_string)
                   i=0
                   l=0
                   count=0
                   while l<k:
                       if string[l:l+m]==sub_string:
                            count=count+1
                       l=l+1     
                   return count
    
               if __name__ == '__main__':
                    string = input().strip()
                    sub_string = input().strip()
    
                    count = count_substring(string, sub_string)
                    print(count)
    
    0 讨论(0)
提交回复
热议问题