正则表达式与re模块
正则表达式#
正则表达式测试网站:
http://tool.chinaz.com/regex/
# 概念
"""
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构造正则表达式的方法就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意集合
"""
# 用途:
'''
用来匹配、校验、筛查所需的数据
任何编程语言都可以使用,在python中如果想用就必须借助内置模块re
'''
# 就是利用一些“特殊符号”的组合去在字符串中筛选出想要的数据
在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据
正则表达式之字符组#
字符组 | 解释说明 |
---|---|
[...] | 匹配字符组中所有的字符 |
[0123456789] | 匹配0到9之间任意一个数字 |
[0-9] | 匹配0到9之间任意一个数字(上面的简写) |
[a-z] | 匹配a到z之间的任意一个小写字母 |
[A-Z] | 匹配A到Z之间的任意一个大写字母 |
[0-9a-zA-Z] | 匹配任意一个数字或者大小写字符(没有顺序) |
正则表达式之特殊符号#
特殊符号默认也是一次匹配一个字符
元字符 | 解释说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配数字、字母、下划线 |
\d | 匹配任意的数字 |
\t | 匹配一个制表符 |
^ | 匹配自字符串的开头字符 |
$ | 匹配字符串的结尾字符,放在句尾 |
\W | 匹配非数字或字母或下划线 |
\D | 匹配非数字 |
a|b | 匹配a或者b,管道符就是或的意思 |
() | 给正则表达式分组,不影响正则匹配 |
[] | 字符组的概念(里面所有的数据都是或的关系) |
[^] | 上箭头出现中括号里的意思是取反(匹配除了字符组中的其他字符) |
正则表达式之量词#
两次必须跟在表达式的后面,不能单独使用
量词 | 解释说明 |
---|---|
* | 重复0次或者多次(默认就是多次,越多越好) |
+ | 重复1次或者多次(默认就是多次,越多越好) |
? | 重复0次或者1次(默认就是1次,越多越好) |
重复n次 | |
重复最少n次最多多次(越多越好) | |
重复n到m次(越多越好) |
取消转义#
"""
在正则表达式中,有很多有特殊意义的元字符,比如\n和\d等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转移,变成"\\"
在python中,不管是正则表达式还是待匹配的内容,都是以字符串的形式出现的,在字符串中"\"也有特殊含义,本身还需要转义,所以如果匹配一次"\n",字符串中要写成"\\n",那么正则里就要写成"\\\\n",这样太麻烦,这时候可以使用r'\n'的概念,而正则式r'\\n'就可以
"""
正则 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
\n | \n | False | 因为正则表达式中\有特殊意义,所以要匹配\n本身 |
\n | \n | True | 转义\之后变成\,即可匹配 |
"\\\\ n" |
"\\ n" |
True | 在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次 |
r'\\ n' |
r'\ n' |
True | 在字符串之前加r,让整个字符串不转义 |
贪婪匹配与非贪婪匹配#
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可
贪婪非贪婪通常都是利用左右两边的条件作为筛选依据
正则 | 匹配字符 | 匹配结果 | 解释说明 |
---|---|---|---|
<.* | <字符>...<字符> | <字符>...<字符> | 表达式匹配从开始小于符号 < 到关闭大于符号 >之间的所有内容。 |
<.*?> | <字符>...<字符> | <字符><字符> | 尽可能匹配比较少的字符,以第一个>的出现作为结束标志 |
re模块#
# 在python中无法直接使用正则,需要借助于模块
1.内置的re模块
2.第三方的其他模块
findall()方法#
# findall 格式: re.findall('要筛选的字符','筛选的文本')
import re
res = re.findall('a','aaayyyy1230000a1a2') #
print(res) # ['a', 'a', 'a', 'a', 'a']
# 结果是所有符合的字符,并且组织成了列表
serch()方法#
# serch 格式: re.serch(正则表达式,待匹配的文本)
import re
res1 = re.search('a','aaayyyy1230000a1a2')
print(res1)
# <_sre.SRE_Match object; span=(0, 1), match='a'>
# 查找到一个符合条件的数据就结束,没有就返回None
print(res1.group()) # a 没有则无法调用group() 直接报错
match()方法#
# match 格式: re.serch(正则表达式,待匹配的文本)
import re
res2 = re.match('a','aaayyyy1230000a1a2')
print(res2) # a 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group()) # a 没有则无法调用group() 直接报错
finditer()方法#
# finditer 格式 re.finditer(正则表达式,待匹配的文本)
import re
res3 = re.finditer('a','aaayyyy1230000a1a2')
print(res3) # 结果是一个迭代器对象 <callable_iterator object at 0x000001C3E67E7438>
print([i.group() for i in res3]) # ['a', 'a', 'a', 'a', 'a']
提前定义一个正则#
# 提前写好需要经常使用的正则
def func1 (*args):
re.compile('\d+')
print(args)
func1(re.findall('1','aaayyyy1230000a1a2')) # (['1', '1'],)
# 定义好了之后反复调用即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY