【方向1】学习方法与心得 | 创意标题匹配解析

161 阅读4分钟

创意标题匹配问题解析

在广告平台中,创意标题的匹配对于广告投放的精准性和用户体验至关重要。广告主可以通过通配符的形式创建标题,之后根据用户的搜索词或关键字将这些通配符动态替换,从而生成个性化的广告内容。本文将基于“创意标题匹配问题”展开分析,并用 Python 正则表达式解决这一问题。

题目地址:创意标题匹配

1、问题分析

题目要求判断给定的标题是否可能是通过模板中替换通配符生成的。这里的模板标题包含 {} 括起来的通配符,它可以匹配任意字符序列(包括空字符),例如:

  • 模板:"ad{xyz}cdc{y}f{x}e"
  • 标题:"adcdcefdfeffe" 可以通过替换 {xyz}, {y}, {x} 等通配符生成。

这个问题的核心在于识别并匹配通配符。通配符在模板中用花括号 {} 包围,任何标题只要符合模板中通配符的规则,便被视为有效匹配。

2、解题思路

为了解决这个问题,思路大致如下:

  1. 模板转换:将模板中的通配符 {...} 转换成能够匹配任意字符的正则表达式 .*
  2. 逐字符解析:对模板字符串进行解析,当遇到 { 时,将直到 } 的内容替换为 .*,并对非通配符字符进行转义,防止特殊字符在正则表达式中出现错误。
  3. 标题匹配:将处理后的模板编译为正则表达式,并对每一个标题进行匹配。如果标题符合正则表达式,则视为生成的标题。

3、代码实现


import re

def solution(n, template, titles):
    # 将模板中的 `{...}` 替换成正则表达式中的 `.*`
    pattern = ""
    i = 0
    while i < len(template):
        if template[i] == '{':
            # 找到通配符的闭合括号
            j = i
            while j < len(template) and template[j] != '}':
                j += 1
            # 用 `.*` 来替代通配符,以匹配任意字符
            pattern += ".*"
            # 移动指针到闭合括号之后
            i = j + 1
        else:
            # 转义正则表达式中的特殊字符
            if template[i] in ".^$*+?{}[]|()\":
                pattern += "\" + template[i]
            else:
                pattern += template[i]
            i += 1

    # 编译正则表达式
    regex = re.compile(f"^{pattern}$")

    # 检查每一个标题是否符合正则表达式
    result = []
    for title in titles:
        if regex.match(title):
            result.append("True")
        else:
            result.append("False")

    # 返回结果
    return ",".join(result)

4、代码解析

  1. 模板处理

    • 遍历模板字符串,当遇到 { 时,找到相应的 } 闭合括号。每次识别到通配符时,将其替换为正则表达式中的 .*,以匹配任何字符。
    • 在非通配符部分,将字符串中的特殊字符如 ., ^, $, * 等转义,确保生成的正则表达式合法。
  2. 正则匹配

    • 将处理后的 pattern 编译成正则表达式 regex,并使用 regex.match(title) 方法检查每个标题是否符合模板。
    • 若匹配成功,则记录为 "True",否则为 "False"。
  3. 输出格式

    • 将结果列表转换成逗号分隔的字符串,符合题目要求。

5、测试与验证

以下是三个测试样例,验证代码的准确性:

python
复制代码
# 测试用例 1
testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
print(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1))  # 输出 "True,False,False,True"

# 测试用例 2
testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"]
print(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2))  # 输出 "False,False,False,False,False,True"

# 测试用例 3
testTitles3 = ["abcdefg", "abefg", "efg"]
print(solution(3, "a{bdc}efg", testTitles3))  # 输出 "True,True,False"

image.png

5、思考与总结

  1. 正则表达式的高效性

    • 使用正则表达式能高效解决通配符匹配问题。然而,若模板复杂或标题数量庞大,匹配效率会降低。因此,在应用场景中可以考虑缓存正则表达式或限制标题和模板长度,以提高整体性能。
  2. 潜在扩展

    • 此方法虽然适用于简单的通配符匹配,但若广告需求更复杂,如需要特定字符的匹配规则、嵌套通配符等,可能需要更高级的正则表达式处理方法或其他算法来增强匹配精度。
  3. 个人见解

    • 在广告标题匹配系统中,不仅需要考虑通配符的灵活性,还需保证匹配的精确度以提升用户体验。因此,设计广告匹配算法时,需要在性能和精度之间找到平衡点。本题在基本匹配的场景下实现了这一点,通过动态模板生成个性化广告内容,对于广告系统来说是非常有意义的。

此题通过模板和通配符的匹配,让我对正则表达式的应用有了更深入的理解。 在实践中,解决类似的问题还能帮助我对字符串处理和正则表达式匹配有更直观的体会。