一行中相同字符的数量 - python

时间:2013-06-02 18:11:00

标签: python string

我有一个字符(例如“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 /更简单的方法来做到这一点?

5 个答案:

答案 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)

使用itertools.takewhile

的一个选项
>>> 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