Python 字符串包含拉长的单词

Python 字符串包含拉长的单词,python,string,character,itertools,Python,String,Character,Itertools,我的字串是:“亲爱的,你好吗?” 我想检查字符串中的单词是否拉长 拉长的意思是:如果单词中的字符数重复了两次以上,例如,too不是拉长的,但是tooo是拉长的 >>> import itertools >>> my_str = 'soooo hiiiii whyyyy done' >>> print [[g[0], sum(1 for _ in g[1])] for g in itertools.groupby(my_str)] [['s',

我的字串是:“亲爱的,你好吗?”

我想检查字符串中的单词是否拉长

拉长的意思是:如果单词中的字符数重复了两次以上,例如,too不是拉长的,但是tooo是拉长的

>>> import itertools
>>> my_str = 'soooo hiiiii whyyyy done'
>>> print [[g[0], sum(1 for _ in g[1])] for g in itertools.groupby(my_str)]
[['s', 1], ['o', 4], [' ', 1], ['h', 1], ['i', 5], [' ', 1], ['w', 1], ['h', 1], 
['y', 4], [' ', 1], ['d', 1], ['o', 1], ['n', 1], ['e', 1]]
我想展示一下,阿雷伊和尤乌都被拉长了。我进行了单个字符计数,但我想检查每个单词是否拉长。

我想到了一个正则表达式:

>>> my_str = 'soooo hiiiii whyyyy done'
>>> import re
>>> regex = re.compile(r"(.)\1{2}")
>>> [word for word in my_str.split() if regex.search(word)]
['soooo', 'hiiiii', 'whyyyy']
说明:

请注意,此算法还会发现一些不长的单词,如
countessship
腹腔镜子宫输卵管卵巢切除术
,但我想这些假阳性很少见:)

您可以使用:

def get_groups(word):
    return [list(g) for k, g in itertools.groupby(word)]

print [word for word in my_str.split(' ') if any(len(x) > 2 for x in get_groups(word))]
下面是它的工作原理:
get\u groups
将单词分组。所以
'sooo'
变成
[['s'],['o','o','o']]


然后,如果任何组的长度超过两个,我们将过滤给定字符串中的所有单词。这意味着您将得到包含三个或更多连续字符的所有单词。

您必须按顺序检查并比较长度,而不导入任何内容:

>>> filter(lambda word: len([letter for index,letter in enumerate(word) if index ==0 or word[index-1] != letter ]) == len( word), my_str.split(" "))
['done']

>>> filter(lambda word: len([letter for index,letter in enumerate(word) if index ==0 or word[index-1] != letter ]) != len( word), my_str.split(" "))
['soooo', 'hiiiii', 'whyyyy']
导入itertools并使用groupby执行此操作:

>>> filter(lambda word: len([letter for letter,gp in itertools.groupby(word) ]) == len( word), my_str.split(" "))
['done']

>>> filter(lambda word: len([letter for letter,gp in itertools.groupby(word) ]) != len( word), my_str.split(" "))
['soooo', 'hiiiii', 'whyyyy']

这最后一个解决方案允许你在每一个好词或坏词上使用ifilter而不是filter和iter。对于流或非常大的字符串有用

您能给我们一个您想要的输出示例吗?您如何知道一个单词被拉长了?
是否也应该计数?这可能不是一个简单的任务。检查3个连续相等的字符是否可以?如果不查字典,连续两个字符是很难的。@user2357112请检查我的编辑香蕉怎么样?它有3个<代码> A >代码> s。这会考虑字符串“ababa”被拉长吗?OP没有指定,但他可能只关心连续的重复。OP现在指定重复必须是连续的。谢谢,我现在更新了答案以反映这一点。我一个接一个地传递单词,所以首先只传递“sooo”,然后是hiiii,所以当我传递sooo时,应该是真的。。上面的代码将如何更改?不,拉长的条件仍然适用,但就像您传递了一个列表一样。我提供了清单中的单词,是的,这是你应该检查的条件<代码>对于我的列表中的单词:if regex.search(word):print(“Booo!”)
。您也可以使用findall在没有循环的情况下执行此操作。也许您希望使用
\w
而不是
。否则,像
==
这样的东西看起来也像是拉长的单词。
>>> filter(lambda word: len([letter for letter,gp in itertools.groupby(word) ]) == len( word), my_str.split(" "))
['done']

>>> filter(lambda word: len([letter for letter,gp in itertools.groupby(word) ]) != len( word), my_str.split(" "))
['soooo', 'hiiiii', 'whyyyy']