【python基础刷题--4.带通配符的字符串匹配】

题目

带通配符的字符串匹配

在这里插入图片描述

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之间的通配符匹配问题。

解题思路

  1. 题目给的带通配符的字符串就可以作为正则表达式的pattern,但是因为题目通配符的规则和re正则表达式中的匹配规则不太一样,所以我们要先处理old字符串的通配符,用replace修改一下就可以了;
  2. 接着就直接用match把两个字符串进行匹配了,因为题目比较小,所以可以不用编译pattern,直接用在match里面就可以了;
  3. 最后更具条件进行输出,这时候需要知道如果没有匹配到返回的是None就行

奇技淫巧

  1. Q:通配符的规则好像和正则有点像但是有区别怎么办?
    –>用replace替换一下,变成满足正则的规则,就可以使用了
  2. Q:match如果没有匹配成功会返回什么?
    –>记住会返回None;还可以注意下match和search的区别
    在这里插入图片描述
  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值