使用python和regex在文本中向h2添加锚点

时间:2010-05-25 15:18:43

标签: python html

我正在尝试使用python为我的html中的所有h2添加锚点。此代码将添加这些锚点,但我也需要填充锚点的名称。

知道名字可以是循环中匹配的编号还是h2标签之间文本的嵌入版本?

到目前为止,这是代码:

regex = '(?P<name><h2>.*?</h2>)'
text = re.sub(regex, "<a name=''/>"+r"\g<name>", text)

2 个答案:

答案 0 :(得分:1)

你可以利用这样一个事实:re.sub的第二个参数可以成为你想做的任何事情的函数。这是一个将<h2>元素中的文本细化的示例:

regex = '(?P<name><h2>(.*?)</h2>)' # Note the extra group inside the <h2>

def slugify(s):
    return s.replace(' ', '-') # bare-bones slugify

def anchorize(matchobj):
    return '<a name="%s"/>%s' % (slugify(matchob.group(2)), matchobj.group(1))

text = re.sub(regex, anchorize, text)

(那slugify函数显然可以使用一些工作。)

您还可以实现一个版本为anchorize且使用全局计数器的计数器,或者更好的是,一个跟踪自己的计数器并实现特殊__call__方法的类。

答案 1 :(得分:0)

不确定我是否理解正确,但是将作者作为名称属性是否足够? 也许你可以使用(只要作者名称不包含属性的无效字符):

regex = '(?P<name><h2>(.*?)</h2>)'
print re.sub(regex, "<a name='\g<2>'/>"+r"\g<name>", text)

如果您需要更高级的替换方法,解析作者姓名或查找某种相关ID,您可以定义替换函数(请参阅re substitute doc):

def name_substitution(matchobj):
    name = matchobj.group(2)
    # do some processing on name here ...
    name = name.replace(' ', '_')
    return "<a name='%s'>%s</a>" % (name, matchobj.group(0))

print re.sub(regex, substitution, text)