2017-10-12 166 views
0

我在Python中的字符串,我想替換多個連續重複字符到1 例如:如何在python中將多個連續的重複字符替換爲1個字符?

st = "UUUURRGGGEENNTTT" 
print(st.replace(r'(\w){2,}',r'\1')) 

但該命令似乎並不奏效,請任何人可以找到幫助有什麼錯用這個命令?

還有就是要解決這個另一種方式,但希望瞭解爲什麼上面的命令失敗,有沒有什麼辦法來糾正它:你需要使用正則表達式

print(re.sub(r"([a-z])\1+",r"\1",st)) -- print URGENT 

回答

1

string.replace(s, old, new[, maxreplace])只做字符串替換:

>>> '(\w){2,}'.replace(r'(\w){2,}',r'\1') 
'\\1' 

這就是爲什麼它失敗,它不能使用正則表達式,所以沒有辦法糾正第一個命令。

3

。 所以你可以這樣做:

import re 

re.sub(r'[^\w\s]|(.)(?=\1)', '', 'UUURRRUU') 

結果是UR。

這是什麼,我有我的快照:對於這個表達式

enter image description here

(.)(?=.*\1)

(.) means: match any char except new lines (line breaks) 
?=. means: lookahead every char except new line (.) 
* means: match a preceding token 
\1 means: to mach the result of captured group, which is the U or R ... 

然後替換所有匹配 ''

也可以檢查這個: lookahead

還要檢查這個工具,我用它, 形容它的一切解決我的正則表達式,你可以學到很多東西從它: regexer

+0

你能解釋一下爲什麼這種方法有效嗎? – armnotstrong

+0

確定我會更新答案 –

+0

你好@abccd,我會在一分鐘內更新答案 –

1

的原因,爲什麼你的代碼不能正常工作,是因爲str.replace不支持正則表達式,你只能用另一個字符串替換一個子字符串。如果要通過匹配正則表達式模式進行替換,則需要使用re模塊。

其次,你的正則表達式也是不正確的,(\w){2,}會匹配任何發生2次或更多次的字符(儘管它們不一定是相同的字符),所以它不起作用。你需要這樣做:

import re 
st = "UUUURRGGGEENNTTT" 
print(re.sub(r'(\w)\1+',r'\1', st))) 
# URGENT 

現在這將只匹配相同的字符2次或更多次。

的替代,「獨一無二」的解決方案,這是你可以使用unique_justseen食譜itertools提供:

from itertools import groupby 
from operator import itemgetter 

st = "UUUURRGGGEENNTTT" 
new ="".join(map(next, map(itemgetter(1), groupby(st)))) 

print(new) 
# URGENT 
相關問題