2014-08-27 45 views
0

我有一個像蟒蛇:去掉最左邊的實例匹配的正則表達式

xp = /dir/dir/dir[2]/dir/dir[5]/dir 

字符串我想

xp = /dir/dir/dir[2]/dir/dir/dir 

xp.replace(r'\[([^]]*)\]', '')刪除所有方括號,我只是想刪除就遠遠的一個剩下。

也應該完全忽略方括號not(random_number_of_characters)

/dir/dir/dir[2]/dir/dir[5]/dir[1][not(random_number_of_characters)]

應該產生/dir/dir/dir[2]/dir/dir[5]/dir[not(random_number_of_characters)]

前。 /dir/dir/dir[2]/dir/dir[5]/dir[not(random_number_of_characters)]

應產生/dir/dir/dir[2]/dir/dir/dir[not(random_number_of_characters)]

+0

你要刪除的最後'[]'括號? – 2014-08-27 10:19:11

+0

括號內是否有一個或多個數字需要刪除,即。 ''/ dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir// dir [2]/dir/dir [A]/dir''不變? – mhawke 2014-08-27 12:02:38

回答

2

此代碼將刪除最後方括號中,

>>> import re 
>>> xp = "/dir/dir/dir[2]/dir/dir[5]/dir" 
>>> m = re.sub(r'\[[^\]]*\](?=[^\[\]]*$)', r'', xp) 
>>> m 
'/dir/dir/dir[2]/dir/dir/dir' 

甲先行用於檢查的方括號是否隨後的不[任何字符,]符號零或者更多次直到行結束。所以它有助於匹配最後的[]括號。然後用空字符串替換匹配的括號會完全刪除最後一個括號。

UPDATE:

你可以試試下面的正則表達式也

\[[^\]]*\](?=(?:[^\[\]]*\[not\(.*?\)\]$)) 

DEMO

+0

你將如何產生一個異常,以便它不會刪除包含'not(random_characters)'ex的方括號。 '/ dir/dir/dir [2]/dir/dir [dir]/dir [dir/dir] [dir/dir] [dir/dir [dir] ' – user299709 2014-08-27 11:02:58

+0

你的意思是不是'['不是'或者你是否想要跳過包含'()'的'[']'? – 2014-08-27 11:06:19

+0

我想跳過整個'[not(randomcharcters)]',我在我的問題中增加了一個例子。 – user299709 2014-08-27 11:07:07

2

讓它貪婪與拍攝組取代。

    (.*)\[[^]]*\](.*) 
Greedy Group ------^^ ^^^^^^^^-------- Last bracket [ till ] 

更換:$1$2\1\2

Online demo

示例代碼:

import re 
p = re.compile(ur'(.*)\[[^]]*\](.*)') 
test_str = u"xp = /dir/dir/dir[2]/dir/dir[5]/dir" 
subst = u"$1$2" 

result = re.sub(p, subst, test_str) 
+0

智能使用貪婪! – 2014-08-27 10:48:31

+0

如果一個方括號的值爲[not(randomcharacters)],你可以讓它跳過整個方括號嗎?我想用'[not(randomcharacters)]'忽略方括號' – user299709 2014-08-27 11:04:10

+0

替換字符串不應該是'ur'\ 1 \ 2''嗎?即反向引用? – mhawke 2014-08-27 11:35:26