是否可以在PYTHON的一个命令中对多个字符串使用.count?

时间:2017-03-18 08:06:28

标签: python regex string count

我想知道是否可以使用.count函数计算多个字符串?

string = "abcdefg"
string.count("." or "!")

当我使用or命令时,它只给出了1个变量的计数,但我想要总数。你如何将它组合起来,使它在没有将它分成两个函数的情况下计算2个字符串?

由于

7 个答案:

答案 0 :(得分:3)

不幸的是,内置的 str.count 函数不支持在单个调用中执行多个字符的计数。其他受访者都使用多次调用 str.count 并对数据进行多次传递。我相信你的问题指出你不想拆分电话。

如果您只希望在一次通话中进行单次通过搜索,还有其他几种方式。

一种方法是使用len(re.findall(r'[ab]', s))这样的正则表达式,它在一次传递中计算 a b 字符的数量。您甚至可以使用内存有效的迭代器形式sum(1 for _ in re.finditer(r'[ab]', s))来执行此操作。

另一种方法是将集合与filter一起使用。例如,len(filter({'a', 'b'}.__contains__, s))也会计算单次传递中 a b 字符的数量。您还可以使用内存有效的迭代器形式sum(1 for _ in itertools.ifilter({'a', 'b'}.__contains__, s))执行此操作。

>>> s = 'abracadabra'
>>> re.findall(r'[ab]', s)
['a', 'b', 'a', 'a', 'a', 'b', 'a']
>>> filter({'a', 'b'}.__contains__, s)
'abaaaba'

只是为了笑容,还有另外一种方法,但它有点不合时宜,len(s) - len(s.translate(None, 'ab'))。这将从总字符串长度开始,并减去已删除 a b 字符的已翻译字符串的长度。

附注:在Python 3中, filter()已更改为返回迭代器。因此,新代码将变为len(list(filter({'a', 'b'}.__contains__, s)))sum(1 for _ in filter({'a', 'b'}.__contains__, s))

答案 1 :(得分:1)

你可以使用一个计数器:简单但可能没有内存效率。

string_ = "abcdefg"
from collections import Counter
counter = Counter(string_)
sum_ = counter['.'] + counter['!']

你也可以简单地使用sum(更好)的列表理解:

string_ = "abcdefg"
sum_ = sum(1 for c in string_ if c in '.!' else 0)

答案 2 :(得分:0)

您可以使用sum方法获取总数。

string = "abcdefg.a.!"

print(sum(string.count(i) for i in '.!'))

输出:

3

答案 3 :(得分:0)

or语句将选择.,因为它不是None,方法count将永远不会看到感叹号。但是,它也无法处理两个独立的字符串。所以你需要单独完成这个。

string.count(".") + string.count("!")

答案 4 :(得分:0)

您可以使用:

string.replace("!",".").count(".")

从性能的角度来看,我不希望这里有任何好处,因为字符串需要解析两次。但是,如果你的主要动机是计算单行中的字符(例如myFunctionReturnsString().replace("!",".").count(".")),这可能会有所帮助

答案 5 :(得分:0)

不使用count(),您可以将原始字符串和搜索字符串拆分为数组,然后检查重叠数组的长度

s = list('abcdefg.a.!')
t = list('.!')
print len([i for i in s if i in t])

>> 3

答案 6 :(得分:0)

您可以使用此代码,并将其设置为变量,然后打印该变量。

text.count(".") + text.count("?") + text.count("!")

例如:

count = text.count(".") + text.count("?") + text.count("!")
print(count)

3
相关问题