count()
函数返回字符串中出现子字符串的次数,但如果字符串重叠则会失败。
假设我的输入是:
^_^_^-_-
我想查找字符串中出现^_^
次。
mystr=input()
happy=mystr.count('^_^')
sad=mystr.count('-_-')
print(happy)
print(sad)
输出是:
1
1
我期待:
2
1
如何达到预期效果?
答案 0 :(得分:3)
新版本
您可以使用正则表达式编写任何显式循环来解决此问题。正如@abhijith-pk's answer巧妙地建议的那样,你可以只搜索第一个字符,其余部分放在一个正面的前瞻中,这样就可以与重叠进行匹配:
def count_overlapping(string, pattern):
regex = '{}(?={})'.format(re.escape(pattern[:1]), re.escape(pattern[1:]))
# Consume iterator, get count with minimal memory usage
return sum(1 for _ in re.finditer(regex, string))
对索引使用[:1]
和[1:]
允许函数在没有特殊处理的情况下处理空字符串,而对索引使用[0]
和[1:]
则不会。 / p>
旧版
您可以使用str.find
允许您指定起始索引的事实来编写自己的例程。这个例程效率不高,但应该有效:
def count_overlapping(string, pattern):
count = 0
start = -1
while True:
start = string.find(pattern, start + 1)
if start < 0:
return count
count += 1
<强>用法强>
两个版本都返回相同的结果。示例用法是:
>>> mystr = '^_^_^-_-'
>>> count_overlapping(mystr, '^_^')
2
>>> count_overlapping(mystr, '-_-')
1
>>> count_overlapping(mystr, '')
9
>>> count_overlapping(mystr, 'x')
0
请注意,找到空字符串len(mystr) + 1
次。我认为这是直观正确的,因为它实际上是在每个角色之间和周围。
答案 1 :(得分:3)
你可以使用正则表达式来快速而肮脏的解决方案:
import re
mystr='^_^_^-_-'
print(len(re.findall('\^(?=_\^)',mystr)))
答案 2 :(得分:1)
你需要这样的东西
def count_substr(string,substr):
n=len(substr)
count=0
for i in range(len(string)-len(substr)+1):
if(string[i:i+len(substr)] == substr):
count+=1
return count
mystr=input()
print(count_substr(mystr,'121'))
输入:12121990
输出:2