正则表达式的用法

it2023-02-10  52

通配符:

*: 代表任意多个字符

?: 代表单个字符

.: 当前目录

.:当前目录的上一级目录

[A-Za-z] [0-9A-Za-Z]

[[:digit:]]:单个数字

[[:upper:]]:单个大写字符

[[:lower:]]:单个小写字符

[[:space:]]:单个空格

glob.glob(’./0-9.*’)获取当前目录下以一个数字开头以.任意结尾的文件

glob.glob(’*.txt’) 以任意多个字符开头以.gif结尾的文件

glob.glob(’?.txt’)以任意单个字符开头以.gif结尾的文件

glob.glob(’**/*.txt’, recursive=True) 任意目录下的以任意多个字符开头以.txt结尾的文件,采用递归方式

glob.glob(’./**/’, recursive=True) 当前目录下的所有目录,采用递归方式

常用的正则字符和规则:

.:匹配任何一个字符;^:匹配除去所列首个字符外的所有字符; ^\d表示必须以数字开头。KaTeX parse error: Undefined control sequence: \d at position 14: :匹配字符串的尾部字符 \̲d̲表示必须以数字结束[]:由一对方括号括起来的字符,表明一个字符集合,能够匹配包 含在其中的任意一个字符。’-‘ 减号来指定一个字符集合的范围。例子:[a-zA-Z][^a-zA-Z]| 将两个规则并列起来,注意是匹配两边所有的规则 要匹配 ‘I have a dog’或’I have a cat’,需要写成r’I have a (?:dog|cat)’ ,而不能写成 r’I have a dog|cat’(?: ) 如果想限定它的有效范围,必需使用一个无捕获组 ‘(?: )’包起来\d 匹配数字,这是一个以’\’开头的转义字符,’\d’表示匹配一个数字,即等价于0-9\D 匹配非数字 这个是上面的反集,即匹配一个非数字的字符,等价于[^0-9]。注意它们的大小写 下面我们还将看到Python的正则规则中很多转义字符的大小写形式,代表互补的关系。\w 匹配字母和数字 匹配所有的英文字母和数字,即等价于[a-zA-Z0-9]。 \W 等价 [^a-zA-Z0-9]\s 匹配间隔符 即匹配空格符、制表符、回车符等表示分隔意义的字符,它等价于[ \t\r\n\f\v]。(注意最前面有个空格) 补集: \S\A 匹配字符串开头 匹配字符串的开头。它和’^’的区别是,’\A’只匹配整个字符串的开头,即使在’M’模式下,它也不会匹配其它行的行首。\Z 匹配字符串结尾 匹配字符串的结尾。它和’$’的区别是,’\Z’只匹配整个字符串的结尾,即使在’M’模式下,它也不会匹配其它各行的行尾。\b’ 匹配单词边界 它匹配一个单词的边界,比如空格等,不过它是一个‘0’长度字符,它匹配完的字符串不会包括那个分界的字符。 而如果用’\s’来匹配的话,则匹配出的字符串中会包含那个分界符\B 匹配非边界 它同样是个0长度字符。re.findall( r’\Bbc\w+’ , s ) #匹配包含’bc’但不以’bc’为开头的单词 [‘bcde’] #成功匹配了’abcde’中的’bcde’,而没有匹配’bcd’(?# ) 注释 Python允许你在正则表达式中写入注释 0或多次匹配 1次或多次匹配 表示匹配前面的规则至少1次,可以多次匹配 ? 0或1次匹配 只匹配前面的规则0次或1次{m} 精确匹配m次 {m,n} 匹配最少m次,最多n次。(n>m) 指定最少3次:{3,} 最大为5次:{,5} 例子: re.findall( r’\b\d{3}\b’ , s ) # 寻找3位数‘?’ ‘+?’ ‘??’ 最小匹配 ‘’ ‘+’ ‘?’通常都是尽可能多的匹配字符(贪婪匹配)。有时候我们希望它尽可能少的匹配。 #例子 re.match(r’^(\d+)(0*)$’, ‘102300’).groups() #(‘102300’, ‘’)

re.match(r’^(\d+?)(0*)$’, ‘102300’).groups() #(‘1023’, ‘00’)

(?<=…) 前向界定 括号中’…’代表你希望匹配的字符串的前面应该出现的字符串。 前向界定括号中的表达式必须是常值,也即你不可以在前向界定的括号里写正则式(?=…) 后向界定 不过如果你只要找出后面接着有字母的数字,你可以在后向界定写正则式: re.findall( r’\d+(?=a-z+)’, s )(?<!..) 前向非界定 只有当你希望的字符串前面不是’…’的内容时才匹配(?!..) 后向非界定 只有当你希望的字符串后面不跟着’…’内容时才匹配。() 包含在’()’中的内容,而虽然前面和后面的内容都匹配成功了,却并不包含在结果中, 用group()或group(0)返回匹配的所有结果,用 group(1),(2)…返回第1,2…个()里面的内容(?(id/name)yes-pattern|no-pattern) 判断指定组是否已匹配,执行相应的规则 这个规则的含义是,如果id/name指定的组在前面匹配成功了,则执行yes-pattern的正则式,否则执行no-pattern的正则式。

综合例子 s2 = ‘aaa bbb111 cc22cc 33dd’ re.findall( r’\ba-z+\d*\b’ , s2 ) # [‘aaa’, ‘bbb111’] #必须至少1个字母开头,以连续数字结尾或没有数字,并且首尾为边界符

s3 = ‘123 10e3 20e4e4 30ee5’ re.findall( r’\b\d+[eE]?\d*\b’ , s ) # [‘123’, ‘10e3’] 这样就可以把科学计数法记录的数字也拿出来了

s4 = ‘/* part 1 / code / part 2 /’ # 找出 C++注释 re.findall(r’/*.?*/’,s4) # [’/* part 1 /’, '/ part 2 /’] # .? 表示匹配任意一个字符0次或多次,加?表示尽可能少匹配,要加转义符 \

re.findall( r’(?<=/*).+?(?=*/)’,s4) # 不希望匹配的结果把’/’和’/’也包括进来

s5 = ‘aaa111aaa , bbb222 , 333ccc’ #re.findall( r’(?<=a-z+)\d+(?=a-z+)’ , s5 ) # 前向错误 ,后向可以 # 要匹配包夹在字母中间的数字

re.findall (r’a-z+(\d+)a-z+’ , s5 ) # 使用group

最新回复(0)