如果您真的擅长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