有沒有辦法將重複字符減少到特定的數字,例如,如果我們有這個字符串。如何使用Python減少字符串中的重複字符
"I liiiiked it, thaaaaaaank you"
預期輸出:"I liiiiked it thaaaank you"
因此,如果超過4複製的字符,例如,應當減少到只有四個字符,如果它小於或等於4,則字應該停留在相同。
有沒有辦法將重複字符減少到特定的數字,例如,如果我們有這個字符串。如何使用Python減少字符串中的重複字符
"I liiiiked it, thaaaaaaank you"
預期輸出:"I liiiiked it thaaaank you"
因此,如果超過4複製的字符,例如,應當減少到只有四個字符,如果它小於或等於4,則字應該停留在相同。
>>> 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次。
哇!真是太棒了,它涵蓋了一切!...非常感謝.. – user2490790
真棒 - 我知道必須有一個單行的正則表達式。你能解釋第二個正則表達式有點像你第一個那樣嗎? –
不是最好的解決辦法 - 我正則表達式需要固定...我想
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
你或許可以開始用這個,如果你願意的話修修補補。
謝謝sooo much !,那真的不錯!讚賞 – user2490790
您可以通過輸入字符串的單次掃描做到這一點,只要保持當前字符的數量,不要將它添加到輸出,如果你有太多的重複:
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)
謝謝,這幾乎與我想要的一樣,但問題是,這種方式需要很長時間...非常感謝您的幫助 – user2490790
@ user2490790:速度可能與Python處理字符串的方式有關,如在我已經鏈接的問題中討論。您可以嘗試新的基於列表的版本,但我無法保證它實際上會更快。 – Marius
你有沒有試過編寫一些代碼來解決這個問題呢?如果是這樣,你應該編輯它到你的問題。 – Marius
感謝您的幫助,我沒有真正正確的代碼..我只是想將字符串拆分爲單詞,然後將每個單詞放入字符列表中,然後遍歷這些字符!但這是手動的,可能需要很長時間,特別是我的數據真的很大! ......他們還有其他更簡單的方法嗎?或模式? – user2490790
你可以通過循環或正則表達式來完成。這是你的功課,對吧?如果你希望學習,也許你需要自己在這裏做一些工作。 –