我有这样的模板标签:
@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)放到我的物体上时。它只将对象中的最后一个呈现为已更改的版本。我怎样才能在必要时运行它?谢谢。
答案 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)