具有要提取的匹配组的正向观察

时间:2013-02-06 15:14:51

标签: python regex lookbehind

testString = ("<h2>Tricks</h2>"
              "<a href=\"#\"><i class=\"icon-envelope\"></i></a>")
import re
re.sub("(?<=[<h2>(.+?)</h2>\s+])<a href=\"#\"><i class=\"icon-(.+?)\"></i></a>", "{{ \\1 @ \\2 }}", testString)

这会产生:invalid group reference

使替换仅采用\\1,仅提取envelope,这使我认为后视被忽略。有没有办法从lookbehind中提取一些东西?

我期待着制作:

<h2>Tricks</h2>
{{ Tricks @ envelope }}

1 个答案:

答案 0 :(得分:1)

看起来你确实想要使用HTML解析器。混合正则表达式和HTML真的很痛苦,非常快。

在正则表达式中,您创建了一个由&lt;,h,2,&gt;等组成的字符类(一组允许匹配的字符):

[<h2>(.+?)</h2>\s+]

本可以写成:

[<>h2()+.?/\s]

它会匹配相同的字符。

除非你想为匹配创建一组字符(\ s,\ d等是预建的字符类),否则不要使用[..]。

但是,即使您要删除括号,也不允许使用lookbehind。您不能在lookbehind中使用可变宽度模式(no +或*)。所以,使用字符类后,lookbehind不再匹配您认为匹配的内容,没有它后观点是不允许的。

总而言之,只需BeautifulSoup而已。