[python] 문자열에서 주어진 부분 문자열의 발생 횟수

파이썬에서 문자열에 주어진 하위 문자열이 몇 번이나 있는지 계산할 수 있습니까?

예를 들면 다음과 같습니다.

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



답변

string.count(substring)다음과 같이 :

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

최신 정보:

주석에서 지적했듯이 이것은 겹치지 않는 발생에 대해 수행하는 방법 입니다. 중복 발생 횟수를 계산해야하는 경우 ” Python regex 에서 중복 일치 항목을 모두 찾으십니까? “에서 답을 확인하거나 아래의 다른 대답을 확인하십시오.


답변

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


답변

실제로 의미하는 바에 따라 다음과 같은 해결책을 제안합니다.

  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

답변

주어진 문자열에서 겹치는 하위 문자열을 찾는 가장 좋은 방법은 파이썬 정규 표현식을 사용하는 것입니다. 정규 표현식 라이브러리를 사용하여 모든 겹치는 일치 항목을 찾습니다. 왼쪽에 부분 문자열이 있고 오른쪽에 일치하는 문자열을 제공하는 방법은 다음과 같습니다.

print len(re.findall('(?=aa)','caaaab'))
3


답변

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  

나는 나 자신 이이 알고리즘을 확인하고 작동했습니다.


답변

두 가지 방법으로 빈도를 계산할 수 있습니다.

  1. count()in 사용 str:

    a.count(b)

  2. 또는 다음을 사용할 수 있습니다.

    len(a.split(b))-1

a문자열은 어디에 b있으며 빈도를 계산할 부분 문자열입니다.


답변

메서드와 관련된 현재 최고의 답변은 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