创意标题匹配问题
问题描述:
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。
好的,让我们来详细分析一下这个问题,并提供一些解题思路。
问题解析
你有一个包含通配符 {} 的模板字符串,通配符可以包含0个或多个字符。你需要判断给定的多个标题是否可以通过替换模板中的通配符生成。
数据结构选择
- 正则表达式:用于解析模板中的通配符和固定部分。
- 字符串匹配:用于检查标题是否与模板匹配。
算法步骤
-
解析模板:
- 使用正则表达式提取模板中的固定部分和通配符部分。
- 将固定部分和通配符部分分别存储。
-
构建正则表达式模式:
- 将固定部分用正则表达式转义,通配符部分用
.*?表示。 - 构建一个完整的正则表达式模式。
- 将固定部分用正则表达式转义,通配符部分用
-
匹配标题:
- 对于每个标题,使用构建好的正则表达式模式进行匹配。
- 检查标题是否完全匹配正则表达式模式。
具体思路
-
解析模板:
- 使用
re.compile(r'\{.*?\}')来匹配模板中的通配符。 - 使用
pattern.split(template_)将模板分割成固定部分和通配符部分。
- 使用
-
构建正则表达式模式:
- 遍历固定部分和通配符部分,将固定部分用
re.escape(part)转义,通配符部分用.*?表示。 - 构建一个完整的正则表达式模式。
- 遍历固定部分和通配符部分,将固定部分用
-
匹配标题:
- 使用
regex.fullmatch(title)来检查标题是否完全匹配正则表达式模式。 - 如果匹配成功,则标题可以通过替换模板中的通配符生成;否则,不能生成。
- 使用
完整代码如下:
if name == "main": # 你可以添加更多测试用例 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" )