2016-11-23 60 views
0

我想刪除所有括號和括號內的文本。我使用正則表達式Python的正則表達式只適用於子字符串匹配,但不是整個字符串

re.sub(r'\(.*\) | \[.*\]', '', text)

這個工程的東西,如:

import re 
text = 'the (quick) brown fox jumps over the [lazy] dog' 
print re.sub(r'\(.*\) | \[.*\]', '', text) 

> the brown fox jumps over the dog 

text = '(the quick) brown fox jumps over the [lazy] dog' 
print re.sub(r'\(.*\) | \[.*\]', '', text) 

> brown fox jumps over the dog 

但是,當整個字符串的正則表達式

text = '[the quick brown fox jumps over the lazy dog]' 
print re.sub(r'\(.*\) | \[.*\]', '', text) 

> [the quick brown fox jumps over the lazy dog] 

> # This should be '' (the empty string) # 

匹配失敗我要去哪裏錯了?

+1

雖然我會小心貪婪的匹配。如果你的文本中有一個隨機的「)」,可能只是一個獨立的符號,那麼這個正則表達式就會擺脫它們之間的一切。例如。 '「這是一個帶有a)符號的(小)示例文本」'會變成'「這是一個符號」'。也許使用不情願的比賽? (請參閱我的回答編輯) – gowrath

+0

@gowrath這是一個重要的說明。在我的情況下,我很有信心,因爲我格式化了數據,但在一般情況下,這是必須處理的東西 – marcman

回答

2

你有多餘的空間了正則表達式,只需要前後|

re.sub(r'\(.*\)|\[.*\]', '', text) 

刪除空間或使它們的可選匹配,以配合您現有的輸出

re.sub(r'\(.*\)\s?|\s?\[.*\]', '', text) 
+0

啊該死的。當然。對於強調使用空格的Python來說太多了;-) – marcman

1

您有一個它試圖匹配的額外空間:)

嘗試:

re.sub(r'\(.*\)|\[.*\]', '', text) 

一個測試正則表達式奇怪的東西的好地方是here。這是一種很好的互動方式,可以查看發生了什麼問題。例如。在你的情況下,它不匹配「(步伐)」,但匹配「(步伐)」,只要我在它後面放一個空格。

注:

正如我在評論中提到,要知道,如果你在你的文字隨機「),」這可能只是一個獨立的象徵貪婪的比賽可能會做意想不到的事情。考慮不願匹配,而不是:

re.sub(r'\(.*?\)|\[.*?\]', '', text) 

它會變成:

This is a (small) sample text with a) symbol" ===> "This is a sample text with a) symbol" 

,而你現在會給:

This is a (small) sample text with a) symbol" ===> "This is a symbol" 
0
import re 
text = '''[the quick brown fox jumps over the lazy dog] 
the (quick) brown fox jumps over the [lazy] dog 
(the quick) brown fox jumps over the [lazy] dog''' 
print (re.sub(r'[(\[].+?[)\]]', '', text)) 

出來:

the brown fox jumps over the dog 
brown fox jumps over the dog 
+0

這將匹配不平衡的parens,並將類似這樣的東西變成:''這是一個[符號和這是一個]符號''變成''這是一個符號「。' – gowrath

+0

是的,你是對的,謝謝你的觀點 –

相關問題