解题思路: 字符串匹配
- 正则中无*号,直接匹配长度,长度一致再匹配内容
- 正则中只有*号,直接返回True
- 正则中有号也有其他符号,按号切割
注意的点:
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()


京公网安备 11010502036488号