2011-07-18 158 views
5

尋找一種快速的方法,當它們彼此緊挨着時,將重複項限制爲最大值2。刪除連續的字母重複

例如:jeeeeeeeep =>['jep','jeep']

尋找在python的建議,但很高興看到在任何一個例子 - 不難切換。

感謝您的幫助!

編輯:英文中沒有任何(或很多)輔音(相同的字母)在一排右邊?讓我們限制這使在一排和兩個元音沒有重複的輔音連續

EDIT2:我傻(嘿,這詞有兩個輔音),只是檢查所有字母,限制重複的字母旁邊,是彼此對二。

+0

在程序的什麼時候你想限制這種?隨着用戶輸入什麼或之後?輸入是什麼樣的?只有一個單詞或整個字符串可能有很多匹配? –

+1

「jjjjeeeeppppp」應該輸出什麼內容? –

+0

@elmugrat - 這基本上是一個拼寫檢查器,但它不是即時的,所以我會修復它後按「輸入」 @NED現在你提到它,我想限制元音兩個和輔音到一個(這對於英語是正確的,對嗎?),所以輸出仍然是['jep','吉普']好點,但規格需要被看到 – jphenow

回答

3

下面是使用groupby遞歸解決方案。我已經離開你呢,你希望能夠重複(默認爲元音僅雖然)的字符:

from itertools import groupby 

def find_dub_strs(mystring): 
    grp = groupby(mystring) 
    seq = [(k, len(list(g)) >= 2) for k, g in grp] 
    allowed = ('aeioupt') 
    return rec_dubz('', seq, allowed=allowed) 

def rec_dubz(prev, seq, allowed='aeiou'): 
    if not seq: 
     return [prev] 
    solutions = rec_dubz(prev + seq[0][0], seq[1:], allowed=allowed) 
    if seq[0][0] in allowed and seq[0][1]: 
     solutions += rec_dubz(prev + seq[0][0] * 2, seq[1:], allowed=allowed) 
    return solutions 

這僅僅是一個試探性地修剪深度優先搜索到你的「解空間」可能的話。啓發式的做法是,我們只允許一次重複一次,並且只有當它是一個有效的可重複字母時。你最後應該以2 ** n個單詞結尾,其中n是他的次數,在你的字符串中重複一個「允許」字符。

>>> find_dub_strs('jeeeeeep') 
['jep', 'jeep'] 
>>> find_dub_strs('jeeeeeeppp') 
['jep', 'jepp', 'jeep', 'jeepp'] 
>>> find_dub_strs('jeeeeeeppphhhht') 
['jepht', 'jeppht', 'jeepht', 'jeeppht'] 
+0

看到我的修改後的職位 - 細化規則。嘗試將元音限制爲連續兩個,否則連續排除其他元音。合理? – jphenow

+0

@jphenow:數字怎麼樣?如果文本中包含意外連續兩次或甚至更多重複的數字,他會提出1111?考慮在這種情況下會出現錯誤的電話號碼。 – Nobody

+0

不擔心數字,但編輯有關輔音的聲明,只是擔心所有的字母 – jphenow

-1

使用正則表達式和按鍵事件!

+1

按鍵事件? – Jacob

+1

我不認爲他想限制從鍵盤輸入。 – Nobody

0

這裏是一個SH + Perl的解決方案,我怕我不知道的Python:

echo jjjjeeeeeeeeppppp | perl -ne 's/(.)\1+/\1\1/g; print $_;' 

的關鍵是找到(.)\1+\1\1替換它,全球正則表達式。

1

使用正則表達式:

>>> import re 
>>> re.sub(r'(.)\1\1+', r'\1\1', 'jeeeep') 
'jeep' 
1

單個字符的解決方案使用groupby

>>> from itertools import groupby 
>>> s = 'jeeeeeeeep' 
>>> ''.join(c for c, unused in groupby(s)) 
'jep' 

而一個最大的兩個人物:

''.join(''.join(list(group)[:2]) for unused, group in groupby(s))