是否有一种简单的方法来获取单词中重复字符的数量?

时间:2018-11-08 11:17:46

标签: python regex string counter

我正在尝试获取一个单词中重复多少个字符。重复必须是连续的。

例如,输入“ loooooveee”的方法应返回6(“ o”的4倍,“ e”的2倍)。

我正在尝试实现字符串级函数,我可以通过这种方式做到这一点,但是,有一种简单的方法吗?正则表达式或其他类型的东西?

到目前为止,我已经尝试过:

def measure_normalized_emphasis(text):
    char = text[-1]
    emphasis_size = 0
    for i in range(1, len(text)):
        if text[-i] == char:
            emphasis_size += 1
        else:
            char = text[i - 1]

    return emphasis_size

它返回8并带有“ loooooveee”。

5 个答案:

答案 0 :(得分:16)

原始问题:order of repetition does not matter

您可以将唯一字母的数量减去总字母的数量。将set应用于字符串将返回唯一的字母集合。

x = "loooooveee"
res = len(x) - len(set(x))  # 6

或者您可以使用collections.Counter,从每个值中减去1,然后sum

from collections import Counter

c = Counter("loooooveee")

res = sum(i-1 for i in c.values())  # 6

新问题:repetitions must be sequential

您可以使用itertools.groupby对连续的相同字符进行分组:

from itertools import groupby

g = groupby("aooooaooaoo")
res = sum(sum(1 for _ in j) - 1 for i, j in g)  # 5

要避免嵌套的sum调用,可以使用itertools.islice

from itertools import groupby, islice

g = groupby("aooooaooaoo")
res = sum(1 for _, j in g for _ in islice(j, 1, None))  # 5

答案 1 :(得分:4)

如果需要,可以使用正则表达式:

import re

rx = re.compile(r'(\w)\1+')

repeating = sum(x[1] - x[0] - 1
                for m in rx.finditer("loooooveee")
                for x in [m.span()])
print(repeating)

这可以正确产生6并利用.span()函数。


表达式是

(\w)\1+

捕获单词字符a-zA-Z0-9_中的一个)并尝试尽可能多地重复。
有关重复模式,请参见a demo on regex101.com


如果要匹配任何字符(即不仅是单词字符),请将表达式更改为:

(.)\1+

请参见another demo on regex101.com

答案 2 :(得分:1)

尝试一下:

word=input('something:')

sum = 0

chars=set(list(word)) #get the set of unique characters

for item in chars: #iterate over the set and output the count for each item
    if word.count(char)>1:
       sum+=word.count(char)
    print('{}|{}'.format(item,str(word.count(char)))

print('Total:'+str(sum))

编辑:

增加了重复总数

答案 3 :(得分:1)

由于重复发生在哪里或要重复哪个字符都没有关系,因此可以使用Python中提供的set数据结构。它将丢弃重复出现的任何字符或对象。

因此,解决方案将如下所示:

def measure_normalized_emphasis(text):
    return len(text) - len(set(text))

这将为您提供准确的结果。

此外,请务必注意一些边缘情况,这是一个好习惯。

答案 4 :(得分:1)

我认为您的代码正在比较错误的内容

您首先要找到最后一个字符:

char = text[-1]

然后将其与自身进行比较:

for i in range(1, len(text)):
    if text[-i] == char: #<-- surely this is test[-1] to begin with?

为什么不只通过字符:

def measure_normalized_emphasis(text):
    char = text[0]
    emphasis_size = 0
    for i in range(1, len(text)):
        if text[i] == char:
            emphasis_size += 1
        else:
            char = text[i]

    return emphasis_size

这似乎可行。