我有一个字符(例如“a”),我需要检查一个字符串(例如“aaaabcd”)以查找一行中“a”的出现次数(在这种情况下,处理在“b”处停止)返回值为4)。
我有这样的事情:
def count_char(str_, ch_):
count = 0
for c in str_:
if c == ch_:
count += 1
else:
return count
所以我在想...有没有更好/更pythonic /更简单的方法来做到这一点?
答案 0 :(得分:4)
re.match
函数将开始查看字符串的开头
m = re.match(r'[%s]+' % ch_, str_)
return m.end() if m else 0
如果你想在字符串的任何部分中使用最多的字符数:
max(len(x) for x in re.findall(r'[%s]+' % ch_, str_))
答案 1 :(得分:4)
>>> from itertools import takewhile
>>> str_ = 'aaaabcd'
>>> ch_ = 'a'
>>> sum(1 for _ in takewhile(lambda x: x == ch_, str_))
4
答案 2 :(得分:1)
如果您只关心字符串的开头,可以使用lstrip
并比较长度:
>>> x = "aaaabcd"
>>> len(x) - len(x.lstrip("a"))
4
也许不是最有效的方式,但最有可能是最简单的方式。
答案 3 :(得分:0)
你可以借用itertools
模块:
from itertools import takewhile, groupby
def startcount1(s, c):
group = takewhile(lambda x: x == c, s)
return len(list(group))
def startcount2(s, c):
key, group = next(groupby(s))
return len(list(group)) if key == c else 0
之后
tests = ['aaaabcd', 'baaaabcd', 'abacadae', 'aaabcdaaa']
for test in tests:
print test,
for f in count_char, startcount1, startcount2:
print f(test, 'a'),
print
将产生
aaaabcd 4 4 4
baaaabcd 0 0 0
abacadae 1 1 1
aaabcdaaa 3 3 3
如果你真的在乎你可以使用sum(1 for _ in ..)
而不是len(list(..))
来避免实现列表,但我发现在我年老的时候我不太关心那些事情。 :^)
答案 4 :(得分:0)
>>> from itertools import takewhile
>>> sum(1 for c in takewhile('a'.__eq__, 'aaaabcd'))
4