HJ71 字符串通配符
通过这道题,学习了正则表达式的用法。
参考资料:
题解 | #字符串通配符#
Python编程中的re.findall
python字符串与文本处理技巧(2)
正则表达式:一种文本模式,用于描述和匹配一系列符合某个模式(规则)的文本。由普通字符(例如字母和数字)以及特殊字符(称为元字符)组成。正则表达式可以用来检索、替换或提取文本中符合某个模式的子串。
re.findall函数可以根据正则表达式,在指定的字符串中搜索满足条件的子字符串,并返回一个列表,其中包含所有匹配到的子字符串。用法如下:
re.findall(pattern, string, flags=0)
可接受三个参数,其中pattern和string是必需的,而flags可选。函数返回一个列表,其中包含了与正则表达式匹配的所有子串。
pattern:正则表达式的模式或模式字符串。
string:要搜索的字符串。
flags:可选参数,用于控制正则表达式的匹配方式,如‘flags = re.IGNORECASE‘ 表示匹配时忽略大小写。
对于这道题,我们首先要将a变为模式字符串,即规定好a中的“?”和“*”能匹配到的字符类型。可以用replace函数。 具体用法按如下:
a.replace(‘?’,‘[a-zA-Z0-9]{1}’) 表示对字符串a进行替换,用到正则表达式的语法。在方括号 [ ] 内,‘a-zA-Z’ 表示匹配任何一个小写字母(从’a’到’z’)或大写字母(‘A’到’Z’),‘0-9’ 表示匹配任何一个数字(从0到9)。花括号 {1} 表示前面的字符类正好出现一次。
‘.replace(’*',“[a-zA-Z0-9]*”)'将字符串中的 ‘*’ 替换为任何一个大小写字母或数字,双引号中最后的“* ”在正则表达式中是贪婪匹配,它会匹配尽可能多的字符
(事实上,如果用了flags = re.IGNORECASE,在replace函数中就不需要a-z和A-Z都写出来,选择一种就好,反正都会忽略大小写。)
如果a和b能匹配成功,那么re.findall(a, b, flags = re.IGNORECASE)就会输出一个只包含b的列表(b中经过贪婪匹配,能匹配成模式a的子字符串只有它自己),因此如果b在re.findall(a, b, flags = re.IGNORECASE)中,输出“true”,否则为“false”。
代码
import re
a = input()
b = input()
a = a.replace('?','[a-zA-Z0-9]{1}').replace('*',"[a-zA-Z0-9]*") # 设置带有通配符的字符串可以匹配的模式字符串
if b in re.findall(a, b, flags = re.IGNORECASE): # a为模式串,b为要搜索的字符串
print('true')
else:
print('false')