2016-05-12 59 views
-3

我一直在試圖做一個re.sub來替換我的python字符串中的重複字符串,並且已經擊中牆壁。在Python中解析文本的問題

我試圖查找和替換字符串爲" *. in *."所有這些是文字,即不重複的空間,然後什麼等等等等

我已經嘗試了很多東西,這裏是目前的一個在我的控制檯:

message = re.sub(r"([\s][*][.][\s]in[\s][*][.])+", " *. in *.",message) 

有人能以我的方式指出我的錯誤嗎?

+0

好了,你想*收縮*多「*。*中。」只有一個?請參閱http://ideone.com/wgEVsR。如果你啓用了're.U'標誌,'\ s'也會加速所有的Unicode空格。嘗試在[\ s] [*] [。])+「,」*。in *。「中輸入message = re.sub(r」([\ s] [*] [。] [\ s]), ,flags = re.U)' –

+0

首先你應該逃避點:'[\。]' –

+3

@Shionion:不,一個人不需要逃避角色類中的點。 –

回答

0

你的正則表達式是笨重的,但它的工作原理。問題是你與替換它完全一樣的字符串

>>> import re 
>>> message = 'string I am trying to find and replace is " *. in *." All those are literal' 
>>> re.sub(r"([\s][*][.][\s]in[\s][*][.])+", " *. in *.", message) 
'string I am trying to find and replace is " *. in *." All those are literal' 
>>> re.sub(r"([\s][*][.][\s]in[\s][*][.])+", "wot", message) 
'string I am trying to find and replace is "wot" All those are literal' 

看到了嗎?有用!

你的正則表達式是「笨重」,因爲你想要的只有兩個神奇字符匹配字面上*.。儘管方括號的確可以消除它們的魔法屬性,但通常的做法是用反斜線來避開它們。所有其他字符和順序做需要支架,所以你需要的是

re.sub(r"(\s\*\.\sin\s\*\.)+", "wot", message) 
+0

*我一直在嘗試做一個re.sub來替換一個**重複的**字符串* - OP試圖收縮幾個重複的子字符串只發生一次。看到我對這個問題的評論。 OP正則表達式和解決方案正常工作。或者應該工作。 –

+0

@WiktorStribiżew:我剛剛測試過重複出現的*。在* .'中,這仍然有效。一串文字重複被一個單獨的「wot」替換,單個出現也是如此。那麼OP應該添加更多的例子。 – usr2564301

+0

感謝您的努力。我複製並粘貼了上面的幾條建議,重複的字符串仍然沒有縮小。當我使用「wot」替換時,字符串變成「wot in wot」。爲了解決這個問題,我改變了戰術,首先取代了「*」。與另一個字符串,然後縮小基本上由Wiktor和Rad建議的代碼。 –