Python 基于正则表达式的自定义模板筛选器找不到字符串中的第一个目标单词(Django 2.1)

Python 基于正则表达式的自定义模板筛选器找不到字符串中的第一个目标单词(Django 2.1),python,regex,django,Python,Regex,Django,我有一个基于正则表达式的自定义模板过滤器,可以查找并突出显示输入搜索引擎的关键字,比如谷歌。例如,如果用户搜索蛋糕,我的过滤器将在“我刚吃了一块蛋糕”中突出显示蛋糕。 以下是过滤器的代码: @register.filter(needs_autoescape=True) @stringfilter def highlight(value, search_term, autoescape=True): # first compile the regex pattern using the s

我有一个基于正则表达式的自定义模板过滤器,可以查找并突出显示输入搜索引擎的关键字,比如谷歌。例如,如果用户搜索蛋糕,我的过滤器将在“我刚吃了一块蛋糕”中突出显示蛋糕。 以下是过滤器的代码:

@register.filter(needs_autoescape=True)
@stringfilter
def highlight(value, search_term, autoescape=True):
    # first compile the regex pattern using the search_term
    pattern = re.compile(re.escape(search_term), re.IGNORECASE)
    # now replace
    new_value = pattern.sub('<span class="highlight">\g<0></span>', value)
    return mark_safe(new_value)
HTML模板:

 <ul>
{% for article in articles %}
<li><a href="{% url 'search:article_detail' article.ArticleID %}">{{ article|highlight:search_term }}</a></li>
<p> {{ article.Content|highlight:search_term|show_excerpt:search_term }} </p>
{% endfor %}
</ul>

我没有发现您的高光过滤器有任何问题,但问题可能是因为show_摘录过滤器。从上一个问题可以清楚地看出,您只想获取搜索关键字前后存在的300个字符,并且只突出显示搜索项

# modified show_excerpt to get the surrounded chars
@register.filter(needs_autoescape=True)
@stringfilter
def show_excerpt(value, search_term, autoescape=True):
    match = re.search('.{0,300}' + re.escape(search_term) + '.{0,300}', str(value), re.IGNORECASE)
    if match: return mark_safe(match.group())
    return ''

请注意,{0300}部分正则表达式将至少匹配0个字符和atmost 300个字符。

我没有发现突出显示筛选器有任何问题,请显示show_摘录筛选器的code@AvinashRajadded=这非常有效!谢谢!我不认为问题出在我的另一个过滤器上
@register.filter(needs_autoescape=True)
@stringfilter
def show_excerpt(value, search_term, autoescape=True):
    #make data into string and lower#
    original_text = str(value)
    lower_original_text = original_text.lower()
    #make keyword into string and lower#
    keyword_string = str(search_term)
    lower_keyword_string = keyword_string.lower()
    #find the position of the keyword in the data#
    keyword_index = lower_original_text.find(lower_keyword_string)
    #Specify the beginning and ending positions of the excerpt#
    start_index = keyword_index 
    end_index = keyword_index + 3000
    #Define the position range of excerpt#
    excerpt = original_text[start_index:end_index]
    return mark_safe(excerpt)
# modified show_excerpt to get the surrounded chars
@register.filter(needs_autoescape=True)
@stringfilter
def show_excerpt(value, search_term, autoescape=True):
    match = re.search('.{0,300}' + re.escape(search_term) + '.{0,300}', str(value), re.IGNORECASE)
    if match: return mark_safe(match.group())
    return ''