马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 非凡 于 2021-10-25 14:25 编辑
正则表达式(regular expression)是一种字符串匹配模式或者规则,它可以用来检索、替换那些符合特定规则的文本。
说直白一点正则标答式可以理解为,我们在一串字符串里,通过设置一定的格式来匹配到我想要的内容
举个简单的例子,我从一个同学的自我介绍里,要获取到名字、年龄、年纪、爱好等信息。#引入re模块
import re
brie = '''大家好!我叫高文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱歌、运动 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
'''
# 定义一个正则表达式去匹配,获取自己想要的信息。(.*?)所在的位置就是我们想要的内容。
#可以这样理解下面这正则表达式“我叫”的后面接的是姓名所以我们要把“我叫”后面到“,”的内容截取出来。后面会详细介绍(.*?)的作用。
pat = '大家好!我叫(.*?),(.*?),我是(.*?)的学生。我的爱好(.*?) 都是我喜欢的项目.'
#创建正则表达式对象
pattern = re.compile(pat)
#将正则表达式去匹配brie元素,提取想要信息
re_list = pattern.findall(brie)
print(re_list)
[('高文烨', '8岁', '中心小学三年级', '广泛,跳舞、唱歌、运动')]
一条正则表达式在一串字符里,是通过遍历方式去匹配所有内容的。假设所有人的自我介绍都是用同样的格式去介绍自己,就可以将所有人的自我介绍关键信息截取出来。#引入re模块
import re
brie = '''
大家好!我叫高文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱歌、运动 都是我喜欢的项目。
大家好!我叫高伟,6岁,我是中心小学三年级的学生。我的爱好广泛,篮球、散步、跳 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫高文,7岁,我是中心小学三年级的学生。我的爱好广泛,跳舞、唱、上网 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫高烨,5岁,我是中心小学三年级的学生。我的爱好广泛,舞、唱歌 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫文烨,8岁,我是中心小学三年级的学生。我的爱好广泛,跳、运动 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
大家好!我叫叶烨,8岁,我是中心小学三年级的学生。我的爱好广泛,、歌、游戏 都是我喜欢的项目,但我最喜欢看书,是个小书迷。
'''
# 定义一个正则表达式去匹配,获取自己想要的信息
pat = '大家好!我叫(.*?),(.*?),我是(.*?)的学生。我的爱好(.*?) 都是我喜欢的项目'
#创建正则表达式对象
pattern = re.compile(pat)
#将正则表达式去匹配brie元素,提取想要信息
re_list = pattern.findall(brie)
print(re_list)
每个人的信息将会以元组的形式,一起存放到一个列表中[('高文烨', '8岁', '中心小学三年级', '广泛,跳舞、唱歌、运动'), ('高伟', '6岁', '中心小学三年级', '广泛,篮球、散步、跳'), ('高文', '7岁', '中心小学三年级', '广泛,跳舞、唱、上网'), ('高烨', '5岁', '中心小学三年级', '广泛,舞、唱歌'), ('文烨', '8岁', '中心小学三年级', '广泛,跳、运动'), ('叶烨', '8岁', '中心小学三年级', '广泛,、歌、游戏')]
网页中,相同的类型的内容,都是以统一的格式存在网页上的
例如电影天堂网里
上面知道了正则表达式的用法,现在来看看正则表达式里各种字符用法。
正则表达式元字符
1) 元字符
正则表表达式元字符
元字符 | 匹配内容 | a, X, 9, < | 普通字符完全匹配。 | . | 匹配除换行符以外的任意字符 | \w | 匹配所有普通字符(数字、字母或下划线)[A-Za-z0-9_] | \s | 匹配任意的空白符[\t\r\n\f] | \d | 匹配数字[0-9] | \n | 匹配一个换行符 | \t | 匹配一个制表符 | \b | 匹配一个单词的结尾 | ^ | 匹配字符串的开始位置.例如:^Python 在字符串或内部行的开头匹配“Python” | $ | 匹配字符串的结尾位置。例如:Python$ 在字符串或内部行的结尾匹配“Python” | \W | 匹配非字母或数字或下划线[A-Za-z0-9_] | \D | 匹配非数字[^0-9] | \S | 匹配非空白符[^\t\r\n\f] | a|b | 匹配字符 a 或字符 b | () | 正则表达式分组所用符号,匹配括号内的表达式,表示一个组。 | [...] | 匹配字符组中的字符 | [^...] | 匹配除了字符组中字符的所有字符 |
2) 量词
正则表达式量词
量词 | 用法说明 | * | 重复零次或者更多次。例如:ruby* 匹配“rub”加上0个以上的y | + | 重复一次或者更多次。例如:ruby+ 匹配“rub”加上1个或更多的y | ? | 重复0次或者一次。例如:ruby? 匹配“rub”或“ruby”:y是可选的 | {n} | 重复n次。例如:\d{3} 完全匹配3位数 | {n,} | 重复n次或者更多次。例如:\d{3,} 匹配3位或更多位数字 | {n,m} | 重复n到m次。例如:\d{3,5} 匹配3,4或5位数 |
3) 字符组
有时也会出现各种字符组成的字符组,这在正则表达式中使用[]表示,如下所示:
正则表达式字符组
正则 | 待匹配字符 | 匹配结果 | 说明 | [0123456789] | 8 | True | 在一个字符组里枚举所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配。 | [0123456789] | a | False | 由于字符组中没有 "a" 字符,所以不能匹配。 | [0-9] | 7 | True | 也可以用-表示范围,[0-9] 就和 [0123456789] 是一个意思。 | [a-z] | s | True | 同样的如果要匹配所有的小写字母,直接用 [a-z] 就可以表示。 | [A-Z] | B | True | [A-Z] 就表示所有的大写字母。 | [0-9a-fA-F] | e | True | 可以匹配数字,大小写形式的 a~f,用来验证十六进制字符。 | [Pp]ython | Python | True | 匹配“Python”或“python” | rub[ye] | ruby | True | 匹配“ruby”或“rube” | [^0-9] | 7 | False | 匹配数字以外的任何东西 |
贪婪模式非贪婪模式
正则表达式默认为贪婪匹配,也就是尽可能多的向后匹配字符,比如 {n,m} 表示匹配前面的内容出现 n 到 m 次(n 小于 m),在贪婪模式下,首先以匹配 m 次为目标,而在非贪婪模式是尽可能少的向后匹配内容,也就是说匹配 n 次即可。
贪婪模式转换为非贪婪模式的方法很简单,在元字符后添加“?”即可实现,如下所示:
非贪婪模式
元字符(贪婪模式) | 非贪婪模式 | * | *? | + | +? | ? | ?? | {n,m} | {n,m}? |
正则表达式转义
如果使用正则表达式匹配特殊字符时,则需要在字符前加\表示转意。常见的特殊字符如下: |