2013-07-17 113 views
0

有沒有辦法將重複字符減少到特定的數字,例如,如果我們有這個字符串。如何使用Python減少字符串中的重複字符

"I liiiiked it, thaaaaaaank you"

預期輸出:"I liiiiked it thaaaank you"

因此,如果超過4複製的字符,例如,應當減少到只有四個字符,如果它小於或等於4,則字應該停留在相同。

+3

你有沒有試過編寫一些代碼來解決這個問題呢?如果是這樣,你應該編輯它到你的問題。 – Marius

+0

感謝您的幫助,我沒有真正正確的代碼..我只是想將字符串拆分爲單詞,然後將每個單詞放入字符列表中,然後遍歷這些字符!但這是手動的,可能需要很長時間,特別是我的數據真的很大! ......他們還有其他更簡單的方法嗎?或模式? – user2490790

+0

你可以通過循環或正則表達式來完成。這是你的功課,對吧?如果你希望學習,也許你需要自己在這裏做一些工作。 –

回答

6
>>> import re 
>>> s="I liiiiked it, thaaaaaaank you" 
>>> re.sub(r"(.)(\1{3})(\1+)", r"\1\2", s) 
'I liiiiked it, thaaaank you' 

這個正則表達式查找3組。

第一個是任何字符。第二個是同一個角色的三個以上,第三個是第一個角色的一個或多個。

這些3個基團,然後通過剛組1和組2

下面是一個更簡單的方法代替

>>> re.sub(r"(.)\1{4,}", r"\1"*4, s) 
'I liiiiked it, thaaaank you' 

這一次只有一個組(.),這是的第一個字母比賽。這必須跟着相同的字母4次或更多次\1{4,}。所以它匹配5個或更多相同的字母。替換就是這個字母重複4次。

+0

哇!真是太棒了,它涵蓋了一切!...非常感謝.. – user2490790

+0

真棒 - 我知道必須有一個單行的正則表達式。你能解釋第二個正則表達式有點像你第一個那樣嗎? –

1

不是最好的解決辦法 - 我正則表達式需要固定...我想

import re 

def rep(o): 
    g = o.group(0) 
    if len(g) > 4: 
     return g[0:3] 
    return g 

foo = 'iiiiiiii liiiiiiikkkkkkkkkeeeee fooooooddd' 
foo1 = re.sub(r'(\w)\1+', rep, foo) 

# iiii liiiikkkkeeee fooooddd 

你或許可以開始用這個,如果你願意的話修修補補。

+0

謝謝sooo much !,那真的不錯!讚賞 – user2490790

2

您可以通過輸入字符串的單次掃描做到這一點,只要保持當前字符的數量,不要將它添加到輸出,如果你有太多的重複:

input_string = "I liiiiked it, thaaaaaaank you" 

max_reps = 4 
prev_char = None 
rep_count = 0 
output = "" 

for char in input_string: 
    if not char == prev_char: 
     rep_count = 1 
     prev_char = char 
     output += char 
    else: 
     if rep_count < max_reps: 
      rep_count += 1 
      output += char 
     else: 
      rep_count += 1 

通過避免字符串連接是有可能更快版本(參見this question):

input_string = "I liiiiked it, thaaaaaaank you" 

max_reps = 4 
prev_char = None 
rep_count = 0 
output_list = [] 

for char in input_string: 
    if not char == prev_char: 
     rep_count = 1 
     prev_char = char 
     output_list.append(char) 
    else: 
     if rep_count < max_reps: 
      rep_count += 1 
      output_list.append(char) 
     else: 
      rep_count += 1 

output = ''.join(output_list) 
+0

謝謝,這幾乎與我想要的一樣,但問題是,這種方式需要很長時間...非常感謝您的幫助 – user2490790

+0

@ user2490790:速度可能與Python處理字符串的方式有關,如在我已經鏈接的問題中討論。您可以嘗試新的基於列表的版本,但我無法保證它實際上會更快。 – Marius

相關問題