如果您真的擅长Python和正则表达式,请帮助修复函数 def粗体字(文本、指针): 返回mark_safe(重新编译(r“\b(%s)\b“%”连接(映射(重新转义,指针分割(“”)),重新I).sub(r'\1',文本))

如果您真的擅长Python和正则表达式,请帮助修复函数 def粗体字(文本、指针): 返回mark_safe(重新编译(r“\b(%s)\b“%”连接(映射(重新转义,指针分割(“”)),重新I).sub(r'\1',文本)),python,regex,Python,Regex,这是当前我的函数,用于在给定指针的情况下加粗字符串文本。(比如谷歌……当你搜索时,他们会为你加粗文本) 当指针处于“显示”状态时,它将不会突出显示“www.theshow.com” 当指针为“我的节目(视频)”时,它不会高亮显示“我的节目(视频)”…它只高亮显示我的节目 当指针指向“苹果的ipad”时,它不会突出显示“苹果的ipad”……它只突出显示ipad 预期产出: www.theshow.com ,电流输出: www.theshow.com 预期产出: 我的节目(视频) ,电流输出: 我

这是当前我的函数,用于在给定指针的情况下加粗字符串文本。(比如谷歌……当你搜索时,他们会为你加粗文本)

  • 当指针处于“显示”状态时,它将不会突出显示“www.theshow.com”
  • 当指针为“我的节目(视频)”时,它不会高亮显示“我的节目(视频)”…它只高亮显示我的节目
  • 当指针指向“苹果的ipad”时,它不会突出显示“苹果的ipad”……它只突出显示ipad

    预期产出: www.theshow.com ,电流输出: www.theshow.com

    预期产出: 我的节目(视频) ,电流输出: 我的节目(视频)

    预期: 苹果ipad ,目前: 苹果ipad

我想主要的问题是当我把空格和其他标点分开的时候。正确的? 有人可以修改我目前的功能以考虑这些因素吗


谢谢

您的描述告诉我A)输入变量没有正确地按空格分割,B)没有正确地转义

我认为这可能是括号内表达式的一个例子:

试试这个:

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))
return mark\u safe(重新编译((r“\b(%s)\b“%(“|”).join(映射(重新转义,指针分割(“”)),重新I)).sub(r'\1',text))

您的描述告诉我A)输入变量没有正确地按空格分割,B)没有正确地转义

我认为这可能是括号内表达式的一个例子:

试试这个:

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))
return mark\u safe(重新编译((r“\b(%s)\b“%(“|”).join(映射(重新转义,指针分割(“”)),重新I)).sub(r'\1',text))

这是我添加的一些管道胶带,可以帮助您通过列出的案例——这个问题实际上非常有趣。可能有一些情况是不正确的(例如,如果搜索
鸭子
,谷歌将突出显示
鸭子
,这只适用于
鸭子的

如果没有一套更为通用的指导原则,编写一个涵盖所有情况的正则表达式是很困难的,但这取决于您需要它的接近程度,最终将决定您需要使它变得多么复杂

return mark_safe(re.compile((r"\b(%s)\b" % ("|".join(map(re.escape, needle.split(' '))), re.I))).sub(r'<strong>\1</strong>', text))
import re,字符串
def粗体字(文本、指针):
n=re.sub('[%s]s*'%re.escape(字符串标点符号),'',指针)
模式=地图(关于逃逸,n.分割(“”))
模式。追加(n.replace(“”,,))
regex=re.compile(r“\b(%s)\b“%”join(patterns),re.I)
match=re.match(正则表达式,text.replace(“”,,))
如果匹配:
返回“%s%text”
返回re.sub(正则表达式,r'\1',文本)
印刷黑体字(“www.theshow.com”,“the show”)
打印粗体字(“我的节目(视频)”,“我的节目(视频)”)
打印粗体字(“苹果ipad”,“苹果的ipad”)
打印粗体字(“堆栈溢出”、“堆栈溢出”)
输出

import re, string

def boldword(text,needle):
    n = re.sub('[%s]s*' % re.escape(string.punctuation), '', needle)
    patterns = map(re.escape, n.split(' '))
    patterns.append(n.replace(' ', ''))
    regex = re.compile(r"\b(%s)\b" % '|'.join(patterns), re.I)
    match = re.match(regex, text.replace(' ',''))
    if match:
        return "<strong>%s</strong>" % text
    return re.sub(regex, r'<strong>\1</strong>', text)

print boldword("www.theshow.com", "the show")
print boldword("my show (video)", "my show (video)")
print boldword("apple ipad", "apple's ipad")
print boldword("stack overflow", "stackoverflow")
>www.theshow.com
>>我的节目视频)
>>苹果ipad
>>堆栈溢出

这是我添加的一些管道胶带,可以帮助您通过列出的案例——这个问题实际上非常有趣。可能有一些情况是不正确的(例如,如果搜索
鸭子
,谷歌将突出显示
鸭子
,这只适用于
鸭子的

如果没有一套更为通用的指导原则,编写一个涵盖所有情况的正则表达式是很困难的,但这取决于您需要它的接近程度,最终将决定您需要使它变得多么复杂

return mark_safe(re.compile((r"\b(%s)\b" % ("|".join(map(re.escape, needle.split(' '))), re.I))).sub(r'<strong>\1</strong>', text))
import re,字符串
def粗体字(文本、指针):
n=re.sub('[%s]s*'%re.escape(字符串标点符号),'',指针)
模式=地图(关于逃逸,n.分割(“”))
模式。追加(n.replace(“”,,))
regex=re.compile(r“\b(%s)\b“%”join(patterns),re.I)
match=re.match(正则表达式,text.replace(“”,,))
如果匹配:
返回“%s%text”
返回re.sub(正则表达式,r'\1',文本)
印刷黑体字(“www.theshow.com”,“the show”)
打印粗体字(“我的节目(视频)”,“我的节目(视频)”)
打印粗体字(“苹果ipad”,“苹果的ipad”)
打印粗体字(“堆栈溢出”、“堆栈溢出”)
输出

import re, string

def boldword(text,needle):
    n = re.sub('[%s]s*' % re.escape(string.punctuation), '', needle)
    patterns = map(re.escape, n.split(' '))
    patterns.append(n.replace(' ', ''))
    regex = re.compile(r"\b(%s)\b" % '|'.join(patterns), re.I)
    match = re.match(regex, text.replace(' ',''))
    if match:
        return "<strong>%s</strong>" % text
    return re.sub(regex, r'<strong>\1</strong>', text)

print boldword("www.theshow.com", "the show")
print boldword("my show (video)", "my show (video)")
print boldword("apple ipad", "apple's ipad")
print boldword("stack overflow", "stackoverflow")
>www.theshow.com
>>我的节目视频)
>>苹果ipad
>>堆栈溢出

你最大的问题似乎是单词边界。如果您正在搜索的标记可以以非单词字符开头或结尾(例如,
(视频)
),则将正则表达式括在
\b
中会阻止匹配。它们还阻止两个或多个连续令牌的匹配(例如,
www.theshow.com
中的
theshow
)。但是,与其丢失单词边界,我建议您忽略搜索表达式中的标点符号,并构造正则表达式,以便一次匹配一个或多个标记:

>> www.<strong>theshow</strong>.com
>> <strong>my</strong> <strong>show</strong> (<strong>video</strong>)
>> <strong>apple ipad</strong>
>> <strong>stack overflow</strong>

/\W+/
上拆分将删除所有标点符号和空格,因此无需转义任何内容。我的结果似乎与您想要的结果相符,除了
(视频)
中的括号没有突出显示,只有
视频
中的单词被突出显示。如果搜索表达式是“show”,它会在
www.theshow.com
中突出显示
theshow
,而不是在
www.footheshowbar.com

中突出显示
theshow
。如果您正在搜索的标记可以以非单词字符开头或结尾(例如,
(视频)
),则将正则表达式括在
\b
中会阻止匹配。它们还阻止两个或多个连续令牌的匹配(例如,
theshow