尋找一種快速的方法,當它們彼此緊挨着時,將重複項限制爲最大值2。刪除連續的字母重複
例如:jeeeeeeeep
=>['jep','jeep']
尋找在python的建議,但很高興看到在任何一個例子 - 不難切換。
感謝您的幫助!
編輯:英文中沒有任何(或很多)輔音(相同的字母)在一排右邊?讓我們限制這使在一排和兩個元音沒有重複的輔音連續
EDIT2:我傻(嘿,這詞有兩個輔音),只是檢查所有字母,限制重複的字母旁邊,是彼此對二。
尋找一種快速的方法,當它們彼此緊挨着時,將重複項限制爲最大值2。刪除連續的字母重複
例如:jeeeeeeeep
=>['jep','jeep']
尋找在python的建議,但很高興看到在任何一個例子 - 不難切換。
感謝您的幫助!
編輯:英文中沒有任何(或很多)輔音(相同的字母)在一排右邊?讓我們限制這使在一排和兩個元音沒有重複的輔音連續
EDIT2:我傻(嘿,這詞有兩個輔音),只是檢查所有字母,限制重複的字母旁邊,是彼此對二。
下面是使用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']
這裏是一個SH + Perl的解決方案,我怕我不知道的Python:
echo jjjjeeeeeeeeppppp | perl -ne 's/(.)\1+/\1\1/g; print $_;'
的關鍵是找到(.)\1+
和\1\1
替換它,全球正則表達式。
使用正則表達式:
>>> import re
>>> re.sub(r'(.)\1\1+', r'\1\1', 'jeeeep')
'jeep'
單個字符的解決方案使用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))
在程序的什麼時候你想限制這種?隨着用戶輸入什麼或之後?輸入是什麼樣的?只有一個單詞或整個字符串可能有很多匹配? –
「jjjjeeeeppppp」應該輸出什麼內容? –
@elmugrat - 這基本上是一個拼寫檢查器,但它不是即時的,所以我會修復它後按「輸入」 @NED現在你提到它,我想限制元音兩個和輔音到一個(這對於英語是正確的,對嗎?),所以輸出仍然是['jep','吉普']好點,但規格需要被看到 – jphenow