首页 Python修行正文

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

欲儿 Python修行 2022-09-10 216 0

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

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


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

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






版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论