0
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.

使替换 take only \\1, only extracts envelope,这让我认为后视被忽略了。有没有办法从lookbehind中提取一些东西?

我期待制作:

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

1 回答 1

1

看起来您真的想改用 HTML 解析器。混合正则表达式和 HTML 真的很痛苦,真的很快。

在您的正则表达式中,您在这里创建了一个由 <、h、2、> 等组成的字符类(一组允许匹配的字符):

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

可以写成:

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

它会匹配相同的字符。

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

但是,即使您要删除括号,也不允许向后看。不允许在后视中使用可变宽度模式(无 + 或 *)。因此,对于字符类,lookbehind 不再匹配您认为它匹配的内容,没有它,lookbehind 是不允许的。

总而言之,只是BeautifulSoup代替。

于 2013-02-06T16:05:03.477 回答