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 }}
答案 0 :(得分:1)
看起来你确实想要使用HTML解析器。混合正则表达式和HTML真的很痛苦,非常快。
在正则表达式中,您创建了一个由&lt;,h,2,&gt;等组成的字符类(一组允许匹配的字符):
[<h2>(.+?)</h2>\s+]
本可以写成:
[<>h2()+.?/\s]
它会匹配相同的字符。
除非你想为匹配创建一组字符(\ s,\ d等是预建的字符类),否则不要使用[..]。
但是,即使您要删除括号,也不允许使用lookbehind。您不能在lookbehind中使用可变宽度模式(no +或*)。所以,使用字符类后,lookbehind不再匹配您认为匹配的内容,没有它后观点是不允许的。
总而言之,只需BeautifulSoup而已。