📜  具有三个符号( * 、 + 、 ? )的通配符模式匹配(1)

📅  最后修改于: 2023-12-03 15:07:05.931000             🧑  作者: Mango

通配符模式匹配

在字符串匹配时,我们通常使用正则表达式来进行匹配,但是有时候我们只需要进行简单的通配符模式匹配,比如匹配文件名、邮箱地址等,此时使用正则表达式会显得过于复杂。而这时候,通配符模式匹配就可以胜任这个任务。

通配符模式匹配是指在字符串匹配时使用通配符来代替部分字符,以此来匹配符合要求的字符串。通配符有多种形式,其中最常见的是由三个符号 *、+、? 组成的通配符。

* 通配符
  • 号可以匹配任意长度的字符串,甚至可以什么都不匹配。比如:
a*              匹配以 a 开头的任意字符串,如 a、abc、abcd 等。
*               匹配任意字符串。
+ 通配符
  • 号可以匹配前面的字符出现一次或多次。比如:
a+              匹配一个或多个 a。
abc+            匹配 abcc、abccc、abcccc 等,但不匹配 abc。
? 通配符

? 号可以匹配前面的字符出现零次或一次。比如:

a?              匹配 a 或者空字符串。
ab?c            匹配 ac 或者 abc。
实例

下面通过一个例子来演示通配符模式匹配的使用:

import fnmatch

patterns = ['*.txt', 'a??b.txt', 'a*.txt']
files = ['a.txt', 'ab.txt', 'abc.txt', 'a1b.txt', 'a2c.txt']

for pattern in patterns:
    print(f"pattern: '{pattern}'")
    for file in files:
        if fnmatch.fnmatch(file, pattern):
            print(f"\tmatch '{file}'")

上述代码中,fnmatch.fnmatch(file, pattern) 用于判断 file 是否符合 pattern 的通配符模式。patterns 是一组匹配模式,files 是一组需要匹配的文件名。下面是输出结果:

pattern: '*.txt'
        match 'a.txt'
        match 'ab.txt'
        match 'abc.txt'
        match 'a1b.txt'
        match 'a2c.txt'
pattern: 'a??b.txt'
        match 'a1b.txt'
pattern: 'a*.txt'
        match 'a.txt'
        match 'ab.txt'
        match 'abc.txt'

从输出结果可以看出,*.txt 匹配所有以 .txt 结尾的文件,a??b.txt 只匹配 a_xxb.txt 的文件名(其中 x 可以是任意字符,但是只有两个字符),a*.txt 匹配以 a 开头并以 .txt 结尾的所有文件名。

总结

通配符模式匹配是一种简单、易用的字符串匹配方式,相对于正则表达式来说,更加简单直观。但是通配符模式匹配也有其缺点:它只能进行简单的匹配,对于复杂的匹配,仍然需要使用正则表达式。