Django模板标签中的正则表达式只匹配一次

时间:2014-08-01 12:20:10

标签: python regex django django-templates

我有这样的模板标签:

@register.filter(name='bknz')
def bknz(text):
    pattern = re.compile(r"(?P<start>.*)\(bkz: (?P<bkz>.*)\)(?P<end>.*)")
    link = r'\g<start>(bkz: <a href="/baslik/\g<bkz>"  title="%\g<bkz> search Twitter">\g<bkz></a>)\g<end>'
    text = pattern.sub(link,text)
    return mark_safe(text)

它将(bkz:something)更改为链接(bkz:something)。它工作正常但只有一次。当我把几个(bkz:sth)放到我的物体上时。它只将对象中的最后一个呈现为已更改的版本。我怎样才能在必要时运行它?谢谢。

2 个答案:

答案 0 :(得分:0)

取出开始和结束组。不需要它们;您希望与(bkz: something)匹配,而不是匹配它。

使用非贪婪匹配正则表达式中的.*会尽可能多地匹配。使用.*?可以避免破坏模式的未来实例。

pattern = re.compile(r"\(bkz: (?P<bkz>.*?)\)")

答案 1 :(得分:0)

这个有效。

@register.filter(name='bknz')
def bknz(text):
    pattern = re.compile(r"(?P<start>.*?)\(bkz: (?P<bkz>[^)]*)\)(?P<end>.*?)")
    link = r'\g<start>(bkz: <a href="/baslik/\g<bkz>"  title="\g<bkz>">\g<bkz></a>)\g<end>'
    text = pattern.sub(link, text)
    return mark_safe(text)