正则表达式——以python示范其实任意编程语言都可以用
2022-09-10
虽然一直在用,但是从来没有把它整理过, 今天在听讲座,临时兴起,就整理一下吧
简单说一下正则是什么意思,说白了就是从一段字符串中,通过自己的表达式,取出自己所需要的字符串,或者去除自己不要的字符串,相当有效
先看一个简单的案例:匹配一个字符母串中的字母
import re string = "123456789aabcde" #需要被匹配的母字符串 ret = "([abc])" #需要被匹配的格式 这里可以看出来,先是一个() 中间又有一个[] []里面又是abc ,而这个abc就是们要匹配的东西了 result = re.findall( ret, string) #通过代码进行匹配 print(result) #输出结果
所以上述代码里面括号的里面的东西可以换的值非常多
[a-z] #匹配小写字母a-z [A-Z] #匹配大写字母A-Z [0-9] #匹配数字0-9 . #匹配除换行符(\n、\r)之外的任何单个字符 [\s\S] #匹配所有字符包括换行符和段落符
那么就会出现一个问题,如果我又想匹配0-9又想匹配a-z,那应该怎么办呢?
其实很简单,只需要在正则匹配里面加上就行。
ret = "([abc0-9])"
输出结果
限定符
那么问题又来了,如果母串 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)
输出结果
所以限定符会有很多我这边也给大家总结了一些常用的,反正我自己用得到的
* 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 ? 匹配前面的子表达式零次或一次 {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)
输出结果:
可以看到结果非常不尽人意,它匹配的结果是45677777 并不是我们要的4567,我们的代码也非常符合逻辑
那为什么会有如此的结果,其实程序默认的就是贪婪匹配,所谓贪婪匹配,就是说,我想要获得的结果是最长的,所以我程序在运行的时候看不到第一个7,我只能看到最后一个7,所以我匹配的结果是45677777
那有没有什么办法,我只获得最短的匹配结果呢,当然是有的就是非贪婪匹配 ,即在匹配的正则表达式里面加入一个 ? 即可
ret = "(4.*?7)"
完整代码
import re string = "45677777" #需要被匹配的母字符串 ret = "(4.*?7)" #需要被匹配的格式 result = re.findall( ret, string) print(result)
运行结果:
发表评论: