def boldword(text, needle):
return mark_safe(re.compile(r"\b(%s)\b" % "|".join(map(re.escape, needle.split(' '))), re.I).sub(r'<strong>\1</strong>', text))
当前,这是我的功能,用于在给定针的情况下加粗字符串文本。 (就像Google ...一样,当您进行搜索时,它们会为您的文字加粗)。
当针是“表演”时,它不会突出显示“ www.theshow.com”。
当针是“我的节目(视频)”时,它不会突出显示“我的节目(视频)” ...而只会突出显示我的节目。
当针是“ apple's ipad”时,它不会突出显示“ apple ipad” ...而只会突出显示ipad。
预期产量:
www.theshow.com
,电流输出:
www.theshow.com
预期产量:
我的节目(视频)
,电流输出:
我的节目(视频)
预期:
苹果ipad
,当前:
苹果ipad
我认为主要的问题是在分割空格与其他标点符号时。对?
有人可以修改我当前的功能以考虑这些因素吗?
谢谢
最佳答案
您最大的问题似乎是边界一词。如果您要搜索的令牌可以以非单词字符开头或结尾(例如(video)
),则将正则表达式包含在\b
中会阻止匹配。它们还防止匹配两个或多个连续令牌(例如,theshow
中的www.theshow.com
)。但是,建议您不要忽略单词边界,而建议您忽略搜索表达式中的标点符号并构造正则表达式,以便一次匹配一个或多个标记:
re.compile(r"\b((?:%s)+)\b" % "|".join(re.split(r"\W+", needle)), re.I)
在
/\W+/
上拆分会删除所有标点符号和空格,因此无需转义任何内容。我的结果似乎与您想要的结果匹配,除了(video)
中的括号未突出显示,仅单词video
被突出显示。如果搜索表达式为"the show"
,则在theshow
中突出显示www.theshow.com
,但在www.footheshowbar.com
中不突出显示。