带有反向引用的re.sub

时间:2015-10-27 13:54:44

标签: python regex

我试图在RequestHandlers中使用python执行某些操作,类似于使用bash中的sed执行此操作的方式。我无法反向引用我读过的用re.sub完成的组,但似乎我做错了。

我想消除一组分隔符或分隔符内的空格以及该行的开头/结尾:

\g<>

如果这是bash,我会做类似的事情:

line1 = 'blah < b la a ah > blah'
line2 = ' b la a ah > blah'
line3 = 'blah < b la a ah '

line1 = re.sub(r"< (.*) (.*) >", r"< \g<1>\g<2> >", line1)
line2 = re.sub(r"^ (.*) (.*) >", r" \g<1>\g<2> >", line2)
line3 = re.sub(r"< (.*) (.*) $", r"< \g<1>\g<2> ", line3)

1 个答案:

答案 0 :(得分:3)

请查看your code demo'blah < b la a ah > blah'与第一个blah < b la aah > blah一起变为re.sub,但稍后,2个最终正则表达式中没有一个与修改后的字符串匹配。

^ (.*) (.*) > (second) regex期望在开头有一个空格,没有空格。 third regex < (.*) (.*) $期望最终空间 - 而且没有。

您可以使用一个正则表达式解决方案。正则表达式 - r"\s*(?=[^<>]*>)" - 将匹配任何空格,0次或更多次出现(\s*),后跟任意数量的任何字符,但<>最多第一个>(?=[^<>]*>)预测)。

line = re.sub(r"\s*(?=[^<>]*>)", "", line)

请参阅IDEONE demo

结果:blah <blaaah> blah

请注意,look-ahead不会消耗字符,这就是为什么我们只删除此正则表达式的空格(匹配)。