我有一個字串,如下所示,我試圖洗掉類似的連續字符。
import re
input = "abccbcbbb";
for i in input :
input = re.sub("(.)\\1 ", "",input);
print(input)
現在我需要讓用戶指定 k 的值。我正在使用以下 python 代碼來執行此操作,但我收到錯誤訊息TypeError: can only concatenate str (not "int") to str
import re
input = "abccbcbbb";
k=3
for i in input :
input= re.sub("(.)\\1 {" (k-1) "}", "",input)
print(input)
uj5u.com熱心網友回復:
for i in input :不做你需要的。i是輸入字串中的每個字符,您re.sub應該將整個輸入作為一個字符序列。
如果您打算匹配特定數量的字符,您應該 在\1. 限制{min,}/{min,max}量詞應該放在它修改的模式之后。
此外,在定義正則運算式時使用原始字串文字更方便。
您可以使用
import re
input_text = "abccbcbbb";
k=3
input_text = re.sub(fr"(.)\1{{{k-1}}}", "", input_text)
print(input_text)
# => abccbc
請參閱此 Python 演示。
原始fr"(.)\1{{{k-1}}}"f 字串文字將轉換為(.)\1{2}模式。在 f 字串中,您需要使用雙花括號來表示文字花括號,并且您無需\1再次轉義,因為它是raw 字串文字。
uj5u.com熱心網友回復:
如果我是你,我更愿意像之前建議的那樣去做。但由于我已經花時間回答這個問題,這里是我的手工解決方案。
下面描述的模式創建了一個名為“letter”的命名組。該組迭代更新,因此首先是 a,然后是 b,等等。然后它會向前查找組“字母”的所有重復(每個字母都會更新)。
所以它會找到所有重復的字母組并將它們替換為空字串。
import re
input = 'abccbcbbb'
result = 'abcbcb'
pattern = r'(?P<letter>[a-z])(?=(?P=letter) )'
substituted = re.sub(pattern, '', input)
assert substituted == result
uj5u.com熱心網友回復:
只是為了確保我的問題正確,您的意思是將“abccbcbbb”變成“abcbcb”,只洗掉連續的重復字符。您是否有理由需要使用正則運算式?你可能會做一個簡單的串列理解。我的意思是這是一種非常簡單和骯臟的方式,但你可以把
input = "abccbcbbb"
input = list(input)
previous = input.pop(0)
result = [previous]
for letter in input:
if letter != previous : result = letter
previous = letter
result = "".join(result)
并且使用這樣的方法,您可以通過一些修改 id 假設使其更容易閱讀和更快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445152.html
