2013-12-11 2 views
3

Моя строка: «ооочень дорогой, как areeeee youuuuuu»строка содержит удлиненные слова

Я хочу, чтобы проверить, если слова в строке удлиненные или нет.

Удлиненные средства: если количество символов в слове повторяется более чем в два раза, например, тоже не удлинено, а 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 являются удлиненными. Я сделал индивидуальный подсчет персонажей, но хочу проверить каждое слово, чтобы увидеть, вытянуто ли оно или нет.

+0

Не могли бы вы привести нам пример вывода, который вы хотите? –

+7

Откуда вы знаете, что слово удлинено? «Должно ли считаться?»? Это не простая задача. – user2357112

+0

Проверить на 3 последовательных равных символа должно быть в порядке? 2 последовательных символа будут жесткими без проверки в словаре. – M4rtini

ответ

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. 

Обратите внимание, что этот алгоритм будет также найти некоторые unelongated слова, как countessship или laparohysterosalpingooophorectomy, но я предполагаю, что эти ложных срабатываний редкие :)

+0

m прохождение слова один за другим, так что сначала только «soooo», а затем hiiiii, поэтому, когда я прохожу soooo, он должен дать true .. как бы это изменило код – fscore

+0

Тогда это просто 'if regex.search («soooo»): '... –

+0

Нет продолженного условия, но вы, как и вы, перешли список. Я предоставляю слова в списке из цикла – fscore

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 превращает слово в группы. So 'sooo' будет [['s'], ['o', 'o', 'o']].

Затем мы фильтруем все слова из данной строки, если длина любой из групп больше двух. Это означает, что вы получите все слова с тремя или более последовательными символами.

+1

Будет ли это рассматривать строки типа «ABABA» для продолжения? ОП не уточнил, но он может заботиться только о непрерывных повторениях. – Kevin

+0

OP теперь указал, что повторения должны быть смежными. – user2357112

+0

Спасибо, теперь я обновил ответ, чтобы отразить это. –

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

последним разрешение этого решением tu использовать также ifilter вместо фильтра и итера на все хорошие или плохие слова. полезно для потока или очень большой строки