区分通配符与正则表达式

通配符在Linux中遇见的比较多,CSS里面也有,而正则表达式范围就更广了,相比于通配符也更复杂,这两者中使用了一些相同的符号来实现匹配,但是同样的符号意义却不一样,在Python中通配符和正则也处于不同的模块中.

正则表达式

正则的概念也不用我多说,基本每个程序员都会使用到,我说说这里面几个和通配符一样的符号,并对他们的意义作出区别,使用markdown有些符号不能单独打出,我居然发现这里面还可以使用转义字符,神奇.

*:匹配前面的子表达式0次或者n次(n∈(0,∞)),属于贪婪匹配,例如fo*,能匹配到fo,foo等,等同于fo{0,}

?:匹配前面的子表达式0次或者1次,例如li(ke)?,能匹配到li,like,等同于{0,1}

[]:匹配一个指定范围的字符,例如[ab]cd,可以匹配到acd,bcd

{}:指定匹配子表达式的个数,有三种形式{n},{n,},{n,m}.

python中使用正则表达式需要导入的模块是re

1
import re

通配符

通配符一般在shell中使用,功能和正则表达式相比要弱很多,一般只用于文件名匹配,匹配方法有点介于简单的字符串方法和全功能的正则表达式之间.

可以在简单的数据处理中使用,注意区别符号的含义

*:星号代替0个,单个,多个字符,可以单独使用,例如*.py,可以匹配到所有后缀为.py的文件.

?:问号代替一个字符,可以单独使用,例如typor?,可以匹配到typora等文件.

python中要使用通配符需要导入的模块是fnmatch

1
2
3
4
5
from fnmatch import fnmatchcase
result_1 = fnmatchcase('test.py', '*.py')
result_2 = fnmatchcase('test.py', 'tes?.py')
print(result_1)
print(result_2)
1
2
True
True

通过比较可以看出,正则中的*和?是无法单独存在,必须和子表达式同时出现作为一个匹配的规则,而通配符中的*和?是可以单独存在的代替一个或多个字符.