string包含细长的单词

时间:2013-12-11 12:56:34

标签: python string character itertools

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

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

细长意味着:如果单词中的字符数重复超过两次,例如,也不会拉长,但是太长了。

>>> 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是拉长的。我做了单独的字符数,但我想检查每个单词,看它是否拉长。

3 个答案:

答案 0 :(得分:6)

一个正则表达式浮现在脑海中:

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

<强>说明:

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

请注意,此算法还会找到一些像countessshiplaparohysterosalpingooophorectomy这样的无用词,但我猜这些误报很少见:)

答案 1 :(得分:3)

您可以使用:

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

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

答案 2 :(得分:1)

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

>>> 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而不是过滤器和iter对每个好或坏的单词。对流或非常大的字符串有用