解题思路: 字符串匹配

  1. 正则中无*号,直接匹配长度,长度一致再匹配内容
  2. 正则中只有*号,直接返回True
  3. 正则中有号也有其他符号,按号切割

注意的点:
1. 正则头和尾有的情况和无号的情况,需要单独考虑
2. 判断两个字符串相等(细节 "?"号 只能匹配字母和数字)

# -*- coding: utf-8 -*-
# 开发者    : QSheng
# 代码文件  : HJ71 字符串通配符.py
# 创建时间  : 2021/7/28 11:13

class Solution():

    def __is_equal(self, str_1, str_2):
        for ch_1, ch_2 in zip(list(str_1), list(str_2)):
            if (ch_1 == "?" and (str(ch_2).isalpha() or str(ch_2).isdigit())) or ch_1 == ch_2:
                continue
            else:
                return False
        return True

    def __find_str(self, i, reg_str_ch, str_ch, str_ch_len):
        rnt = -1
        reg_str_ch_len = len(reg_str_ch)
        for i in range(i, str_ch_len - reg_str_ch_len + 1):
            if self.__is_equal(reg_str_ch, str_ch[i:i+reg_str_ch_len]):
                rnt = i+reg_str_ch_len
                break
        return rnt


    def solve(self, line_reg, line_str):
        """
        字符串匹配
        1. 无*号,直接匹配
        2. 只有*号,直接返回true
        3. 有*号,就按*号切割
            头部无*号处理
            尾部无*号处理
        :param line_reg:
        :param line_str:
        :return:
        """

        # 1. 无*号,直接匹配
        if "*" not in line_reg:
            if len(line_reg) != len(line_str):
                return False
            return self.__is_equal(line_reg, line_str)

        # 2、只有*号,直接返回true
        if "*" == "".join(set(list(line_reg))):
            return True

        #  3. 有*号,就按*号切割
        reg_list = line_reg.split("*")


        # 头部无*号处理
        if line_reg[0] != "*":
            if self.__is_equal(reg_list[0], line_str[0:len(reg_list[0])]) is False:
                return False
            # 去除头部字符串,去除头部正则
            line_str = line_str[len(reg_list[0]):]
            reg_list = reg_list[1:]

        # 尾部无*号处理
        if line_reg[-1] != "*":
            if self.__is_equal(reg_list[-1], line_str[len(line_str) - len(reg_list[-1]):]) is False:
                return False
            # 去除尾部字符串,去除尾部正则
            line_str = line_str[:len(line_str) - len(reg_list[-1])]
            reg_list = reg_list[:-1]

        # 中间部分
        start_i = 0
        reg_str_list_len = len(reg_list)
        str_ch_len = len(line_str)
        for reg_idx in range(reg_str_list_len):
            if len(reg_list[reg_idx]) == 0:
                continue
            # 每个子串匹配主串,并拿到终点下标
            start_i = self.__find_str(start_i, reg_list[reg_idx], line_str, str_ch_len)
            if start_i == -1:
                return False

        return True


import sys
if __name__ == '__main__':
    is_IDE = False
    if is_IDE:
        fr = open("data/HJ71.txt", "r", encoding="utf-8")
    else:
        fr = sys.stdin

    while True:
        line_reg = fr.readline().strip()
        if line_reg == "":
            break
        line_str = fr.readline().strip()
        rnt = Solution().solve(line_reg.lower(), line_str.lower())
        print("true" if rnt else "false")



    if is_IDE:
        fr.close()