2014-08-27 71 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