题目
Code
-法1(使用re模块,很简单)
import re
old=input()
new=input()
old=old.replace('?','.')
old=old.replace('*','.*')
str=re.match(old,new)
if str==None:
print("not matched")
else:
print("matched")
代码解析
这段代码首先读入两个字符串old和new,其中old中包含通配符‘?’和‘*’。
接下来,将old中的‘?’替换成‘.’,将‘’替换成‘.’,这是为了将通配符转换成正则表达式的格式。
然后调用re库中的match函数,使用old中的正则表达式来匹配new字符串。如果匹配失败,则返回None。根据返回值判断匹配结果,如果为None,则输出“not matched”,否则输出“matched”。
这段代码的核心思路是将通配符转换成正则表达式来匹配字符串,使用了Python中内置的re库来实现正则表达式的匹配功能。
-法2(不用正则表达式,纯纯靠逻辑,动态规划挺麻烦的)
x = input()
y = input()
xlen = len(x)
ylen = len(y)
dp = [[0] * (ylen + 1) for _ in range(xlen + 1)]
dp[0][0] = 1
for i in range(1, xlen + 1):
if x[i - 1] == '*' and dp[i - 1][0] == 1:
dp[i][0] = 1
for i in range(1, xlen + 1):
for j in range(1, ylen + 1):
if x[i - 1] == y[j - 1] or x[i - 1] == '?':
dp[i][j] = dp[i - 1][j - 1]
if x[i - 1] == '*':
dp[i][j] = dp[i - 1][j] or dp[i][j - 1]
if dp[xlen][ylen] == 1:
print("matched")
else:
print("not matched")
代码解析
有点小题大做了这段代码使用动态规划的思想,判断通配符匹配问题。
具体解析如下:
- 首先读入字符串x和y,并记录它们的长度。
- 创建一个二维数组
dp
,用于储存匹配状态。dp[i][j]
表示x中前i个字符与y中前j个字符是否匹配。 - 将
dp[0][0]
初始化为1,表示空字符可以匹配。 - 根据‘’的特殊匹配规则,如果第一个字符就是‘’,那么
dp[i][0]
也为1,i>0。 - 对于x中每一个非‘’的字符,逐个与y中字符进行匹配。如果匹配成功,则转移状态到dp[i-1][j-1];如果是‘?’通配符,则同样匹配成功,转移状态到dp[i-1][j-1];如果是‘’通配符,则可匹配任意个字符,需要同时考虑dp[i-1][j](将‘’当作空字符)和dp[i][j-1](将‘’匹配串中的一个字符)两种情况。
- 如果
dp[xlen][ylen]
为1,说明x和y完全匹配,输出“matched”。否则,输出“not matched”。
综上所述,这段代码的主要思路是通过动态规划求解x和y之间的通配符匹配问题。
解题思路
- 题目给的带通配符的字符串就可以作为正则表达式的pattern,但是因为题目通配符的规则和re正则表达式中的匹配规则不太一样,所以我们要先处理old字符串的通配符,用replace修改一下就可以了;
- 接着就直接用match把两个字符串进行匹配了,因为题目比较小,所以可以不用编译pattern,直接用在match里面就可以了;
- 最后更具条件进行输出,这时候需要知道如果没有匹配到返回的是None就行
奇技淫巧
- Q:通配符的规则好像和正则有点像但是有区别怎么办?
–>用replace替换一下,变成满足正则的规则,就可以使用了 - Q:match如果没有匹配成功会返回什么?
–>记住会返回None;还可以注意下match和search的区别