我的字符串是:“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是拉长的。我做了单独的字符数,但我想检查每个单词,看它是否拉长。
答案 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.
请注意,此算法还会找到一些像countessship
或laparohysterosalpingooophorectomy
这样的无用词,但我猜这些误报很少见:)
答案 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对每个好或坏的单词。对流或非常大的字符串有用