2012-06-19 60 views
10

之間的字符串下面是我的問題:在文本變量中包含逗號,我嘗試刪除位於兩個字符串之間的逗號(實際上是[])。例如使用下面的字符串:替換位於

input = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better." 
output = "The sun shines, that's fine [not for everyone] and if it rains, it Will Be better." 

我知道如何使用.replace整個變量,但我不能爲它的一部分做。 有一些主題接近這個網站,但我沒能利用他們爲我自己的問題,如:

+0

預期的輸出? –

回答

15
import re 
Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better." 
Variable1 = re.sub("\[[^]]*\]", lambda x:x.group(0).replace(',',''), Variable) 

首先,你需要找到需要重寫(你re.sub做到這一點),字符串的部分。然後你重寫那些部分。

函數var1 = re.sub("re", fun, var)表示:找到符合re的te變量var中的所有子字符串;用函數fun處理它們;返回結果;結果將被保存到var1變量。

正則表達式 「[[^]] *]」 是指:發現與[(在重新\[)開始,包含除][^]]*在重新)一切子並用]\]在重新)結束。

對於每個找到的事件運行一個將此事件轉換爲新事物的函數。 功能是:

lambda x: group(0).replace(',', '') 

這意味着:採取找到字符串(group(0)),取代','''(刪除換句話說,)並返回結果。

+0

非常感謝它的工作!並感謝您的解釋! – user1453786

+0

@ user1453786:在所有應有的尊重下,@Qtax的答案要好得多。函數'sub'是知道的一種有用的技術,但在這種情況下顯然是過度的。 – georg

+0

@ thg435:不,它不是。因爲它不起作用,例如,對於不平衡的括號。 Qtax檢查前瞻斷言只完成表達式的一部分,這是錯誤的。請不要嘗試'爲了大家],如果下雨,它會[a,c]「,你會自己看到它。當然,我們也可以添加向後看斷言,但這不會太簡單了 –

2

您可以使用像這樣匹配它們(如果括號是平衡的):

,(?=[^][]*\]) 

使用類似:

re.sub(r",(?=[^][]*\])", "", str) 
+0

我喜歡你的答案,它非常乾淨和有效,但我認爲它有一個缺點。我認爲這不適用於不平衡的括號。您只檢查表達式的整理部分。用lookahead/lookbehind斷言來解決這個任務真的很不錯,但我不確定那會如此優雅。 –

-2

如果您不喜歡學習正則表達式(請參閱此頁面上的其他響應),則可以使用partition命令。

sentence = "the quick, brown [fox, jumped , over] the lazy dog" 
left, bracket, rest = sentence.partition("[") 
block, bracket, right = rest.partition("]") 

「塊」現在是在括號中的字符串的一部分,「左」是什麼是左括號左「右」是什麼是左括號的權利。

然後就可以收回全部一句:

new_sentence = left + "[" + block.replace(",","") + "]" + right 
print new_sentence # the quick, brown [fox jumped over] the lazy dog 

如果你有一個以上的塊,你可以把所有這一切在for循環中,在每一步運用partition命令對「權利」。

或者你可以學習正則表達式!從長遠來看這將是值得的。

+0

當字符串中有多個「特殊」部分時(例如:''a,b [c,d] e ,f [g,e] h,i「') –

+0

不要調用變量'string';它會讓開發人員誤以爲它是python stdlib中的['string' module](http://docs.python.org/library/string.html)。 –

+0

另外,爲什麼不在這裏使用'.split('[',1)',無論如何你都在折騰括號。第二個'.partition'調用應該放在'rest'上,而不是放在'string'上,所以這段代碼根本不起作用。 '字符串'結束爲''快速,棕色[快速的棕色[狐狸跳過]懶狗'''。 –

0

這是一個非正則表達式方法。您可以用[//]替代您的[]分隔符,然後在/分隔符上替換爲split。然後需要進行去除comma要處理,這可以在重建字符串列表理解來完成每odd字符串分割清單:

>>> Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, 
       it Will Be better." 
>>> chunks = Variable.replace('[','[/').replace(']','/]').split('/') 
>>> ''.join(sen.replace(',','') if i%2 else sen for i, sen in enumerate(chunks)) 
"The sun shines, that's fine [not for everyone] and if it rains, it Will Be 
better." 
+0

謝謝,我也會試試這個。 – user1453786