簡體   English   中英

刪除連續的字母重復

[英]Remove letter duplicates that are in a row

尋找一種快速的方法來將重復項彼此相鄰時限制為最多 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']

使用正則表達式:

>>> 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))

這里有一個Sh+Perl的解決方案,恐怕我不知道Python:

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

關鍵是查找(.)\1+並將其替換為全局的正則表達式\1\1

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM