yuer
发布于 2022-09-10 / 1606 阅读
0
0

正则表达式——以python示范其实任意编程语言都可以用

虽然一直在用,但是从来没有把它整理过, 今天在听讲座,临时兴起,就整理一下吧

简单说一下正则是什么意思,说白了就是从一段字符串中,通过自己的表达式,取出自己所需要的字符串,或者去除自己不要的字符串,相当有效

先看一个简单的案例:匹配一个字符母串中的字母

import re


string = "123456789aabcde"   #需要被匹配的母字符串

ret = "([abc])"     #需要被匹配的格式    这里可以看出来,先是一个() 中间又有一个[]  []里面又是abc  ,而这个abc就是们要匹配的东西了

result = re.findall( ret, string)  #通过代码进行匹配


print(result)  #输出结果

image.png

所以上述代码里面括号的里面的东西可以换的值非常多

[a-z] #匹配小写字母a-z
[A-Z] #匹配大写字母A-Z
[0-9] #匹配数字0-9
.     #匹配除换行符(\n、\r)之外的任何单个字符
[\s\S] #匹配所有字符包括换行符和段落符

那么就会出现一个问题,如果我又想匹配0-9又想匹配a-z,那应该怎么办呢?

其实很简单,只需要在正则匹配里面加上就行。

ret = "([abc0-9])"

输出结果

image.png

限定符

那么问题又来了,如果母串 1233456 ,我想匹配33456怎么办

很明显上述的过程当中,我们的3需要匹配两次,然后再匹配456,所以我们可以在正则表达式中3的后面加一个{2},表示我们要的是 2个3 + 456 而这个{2} 就是限定符,当然你也可以限定为3

import re


string = "1233456"   #需要被匹配的母字符串

ret = "(3{2}456)"     #需要被匹配的格式   

result = re.findall( ret, string)


print(result)

那么问题又来了,如果母串 12333…333456 ,我不知道有多少个3怎么办

这里要用到一个新的限定符号 * 该符号表示的意思是匹配前面一个字符任意次数(可以是0 1 2 3 4 5 6 7 8 9 …)

import re


string = "12333333333333456"   #需要被匹配的母字符串

ret = "(3*456)"     #需要被匹配的格式    

result = re.findall( ret, string)


print(result)

输出结果

image.png

所以限定符会有很多我这边也给大家总结了一些常用的,反正我自己用得到的

*    匹配前面的子表达式零次或多次
+    匹配前面的子表达式一次或多次
?    匹配前面的子表达式零次或一次
{n}    n 是一个非负整数。匹配确定的 n 次
{n,}   n 是一个非负整数。至少匹配n 次,如果n=2,那表示的匹配2次及以上

转义符

先说现遇到的新问题,字符串 “数学(高级)” 我想正则匹配括号以内的 “高级” 作为结果,于是的正则匹配表达式为 ret = “((.*))”

代码:

import re


string = "数学(高级)"   #需要被匹配的母字符串

ret = "((.*))"    #需要被匹配的格式    

result = re.findall( ret, string)


print(result)

输出结果:

[('数学(高级)', '数学(高级)'), ('', '')]

这并不是我们要的结果,而这个原因就是因为,“(” 括号这个符号比较特殊,和原本符号意思占用,所以要用 “\” 来转义 ,就比如 n是一个字母n ,但是加上 “\”, 就变成了, 换行符 “\n” ,这就是转移符号, 而 \( .*\) 就是将中间两个括号专义为一个普通的括号的意思,不是编程语言中的语法括号

import re


string = "数学(高级)"   #需要被匹配的母字符串

ret = "(\(.*\))"    #需要被匹配的格式    

result = re.findall( ret, string)


print(result)

输出结果:

['(高级)']

贪婪匹配

再给大家简单解释一下贪婪匹配是什么意思

首先 母串 45677777 ,其次我们要匹配4567,这个结果,说白了就是从4开头到7结尾的全部内容

于是开始写代码

import re


string = "45677777"   #需要被匹配的母字符串

ret = "(4.*7)"     #需要被匹配的格式    

result = re.findall( ret, string)


print(result)

输出结果:

image.png

可以看到结果非常不尽人意,它匹配的结果是45677777 并不是我们要的4567,我们的代码也非常符合逻辑

image.png

那为什么会有如此的结果,其实程序默认的就是贪婪匹配,所谓贪婪匹配,就是说,我想要获得的结果是最长的,所以我程序在运行的时候看不到第一个7,我只能看到最后一个7,所以我匹配的结果是45677777

那有没有什么办法,我只获得最短的匹配结果呢,当然是有的就是非贪婪匹配 ,即在匹配的正则表达式里面加入一个 ? 即可

ret = "(4.*?7)"

完整代码

import re


string = "45677777"   #需要被匹配的母字符串

ret = "(4.*?7)"     #需要被匹配的格式    

result = re.findall( ret, string)


print(result)

运行结果:

image.png


评论