分类:方向一:学习方法与心得-题目解析
问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。
样例: 输入:n = 4, template = "ad{xyz}cdc{y}f{x}e", titles = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"] 输出:"True,False,False,True"
思路分析
这道题的测试有问题,注意修改官方给的True和False,确保没有拼写错误。 这道题考察的是正则表达式的使用,定义出正则表达式模板,看title是否和模板匹配。
一、将模板字符串中的所有特殊字符转义
regex_pattern = re.escape(template)
,使template的特殊字符串不会在正则表达式中被解释为特殊符号
二、将通配符转换成正则表达式的匹配符
regex_pattern = re.sub(r'\\{.*?\\}', '.*', regex_pattern)
这行代码的作用是将模板字符串中的通配符部分 {xyz} 替换为正则表达式的匹配符。
正则表达式r'\\{.*?\\}'
匹配转义的花括号 {} 及其中间的内容。
\\{
匹配左花括号 {(由于之前用了 re.escape()
,这里的 { 被转义了,所以需要用 \ 来匹配)。
.*?
表示匹配任意数量的字符(非贪婪匹配),即 {} 之间的内容。
\\}
匹配右花括号 }。
然后,这个通配符被替换为 .*
,表示在正则表达式中匹配任意数量的任意字符。
举个例子:
输入字符串:ad\.\{xyz\}cd\+ef\*
替换后的结果:ad\..*cd\+ef\*
通过这一步操作,模板中类似 {xyz}
的部分变成了正则表达式的 .*
,使得它能够匹配任何字符串,而不是特定的字面文本。
三、在正则表达式的开头和结尾加上锚点
regex_pattern = f'^{regex_pattern}$'
这行代码的作用是在正则表达式的开头和结尾加上锚点,以确保匹配的是整个字符串,而不是字符串的一部分。
具体来说: ^ 表示字符串的开始位置。 $ 表示字符串的结束位置。 通过这两个锚点,正则表达式被修改为匹配整个字符串,而不仅仅是部分匹配。
举个例子:
在前面的步骤中,我们得到了一个正则表达式:ad\..*cd\+ef\*
添加锚点后,变成了:^ad\..*cd\+ef\*$
这意味着,只有当整个字符串与这个模式完全匹配时,才会返回匹配成功。如果不加这些锚点,那么正则表达式可能会匹配输入字符串的一部分。
代码实现
import re
def solution(n, template, titles):
# Convert the template into a regex pattern
regex_pattern = re.escape(template) # Escape to handle special characters
regex_pattern = re.sub(r'\\{.*?\\}', '.*', regex_pattern) # Replace placeholders with '.*'
regex_pattern = f'^{regex_pattern}$' # Ensure full match
# Create a result list
result = []
# Iterate over titles and check if they match the regex
for title in titles:
if re.match(regex_pattern, title):
result.append("True")
else:
result.append("False")
return ",".join(result)
if __name__ == "__main__":
# You can add more test cases here
testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"]
testTitles3 = ["abcdefg", "abefg", "efg"]
print(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1) == "True,False,False,True" )
print(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2) == "False,False,False,False,False,True" )
print(solution(3, "a{bdc}efg", testTitles3) == "True,True,False" )