字符串包含拉长的单词

Posted

技术标签:

【中文标题】字符串包含拉长的单词【英文标题】:string contains elongated words 【发布时间】:2013-12-11 12:56:33 【问题描述】:

我的字符串是:“sooo Dear how areeeee youuuuuu”

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

拉长的意思是:如果单词中的字符数重复超过两次so,例如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]]

我想显示 sooo,areeeee 和 youuuuuu 被拉长了。我计算了单个字符,但我想检查每个单词是否被拉长。

【问题讨论】:

你能给我们一个你想要的输出的例子吗? 你怎么知道一个词被拉长了? too 应该算数吗?这可能不是一项简单的任务。 检查 3 个连续相等的字符应该可以吗?如果不查字典,连续 2 个字符会很困难。 @user2357112 请检查我的编辑 banana 怎么样?其中有 3 个as。 【参考方案1】:

想到一个正则表达式:

>>> my_str = 'soooo hiiiii whyyyy done'
>>> import re
>>> regex = re.compile(r"(.)\12")
>>> [word for word in my_str.split() if regex.search(word)]
['soooo', 'hiiiii', 'whyyyy']

解释:

(.)    # Match any character, capture it in group number 1
\12  # Try to match group number 1 here, twice.

请注意,此算法还会发现一些未加长的词,例如 countessshiplaparohysterosalpingooophorectomy,但我猜这些误报很少见 :)

【讨论】:

m 一个接一个地传递单词,所以首先只有 'soooo' 然后 hiiiii 所以当我通过 soooo 时它应该给出 true .. 上面的代码将如何变化 不,拉长条件仍然适用,但就像您通过了列表一样。我从循环中提供列表中的单词 嗯,是的,这就是您应该检查的条件。 for word in my_list: if regex.search(word): print("Booo!"). 你也可以不用循环,用 findall。 也许您想使用\w 而不是.。否则,===== 之类的东西也看起来像拉长的单词。【参考方案2】:

你可以使用:

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_groups 将一个词变成组。所以'sooo' 变成了[['s'], ['o', 'o', 'o']]

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

【讨论】:

这会考虑像“ABABA”这样的字符串被拉长吗? OP没有具体说明,但他可能只关心连续重复。 OP 现在已经指定重复必须是连续的。 谢谢,我现在更新了答案以反映这一点。【参考方案3】:

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

>>> 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']

import 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。对流或非常大的字符串很有用

【讨论】:

以上是关于字符串包含拉长的单词的主要内容,如果未能解决你的问题,请参考以下文章

为啥有些单词没有被检查或包含在反向单词字符串中?

如果字符串包含列表中的单词,则从字符串中提取单词

无法确定字符串是不是包含数组中的单词

检查字符串是不是在字符串开头包含单词[重复]

是否可以查看字符串是否包含 [多个] 字典单词?

检测字符串是不是包含多个单词的更好方法