正则表达式

由于我长期以来都把笔记放在本地,近来由于数据损坏丢失了不少东西,所以逐渐把之前的内容搬运到CSDN。

一、单个字符的匹配

import re
re.findall('a','abcdef')
re.findall('你好','你好,成都')

在这里插入图片描述
在这里插入图片描述

二、或关系

元字符:|
匹配规则:匹配 | 两侧任意的正则表达式
注意:元字符左右不加空格

print(re.findall('com|cn','www.baidu.com'))
print(re.findall('com|cn','www.baidu.cn'))
print(re.findall('com|cn','www.baidu.com.cn'))

在这里插入图片描述

三、匹配单个字符

元字符:.
匹配规则:匹配除换行外的任意一个字符

re.findall('张.丰','张三丰,张四丰,张六丰,张无忌,张 丰,张丰')

在这里插入图片描述

四、匹配字符集

元字符:[字符集]
匹配规则:匹配字符集中的任意一个字符

re.findall('[ab]','abc')

在这里插入图片描述
[0-9a-zA-Z] 区间内的任意一个字符
[#?0-9a-z] 混合书写,一般区间表达写后边,零散字符写前面

五、匹配字符集反集

#元字符:[^字符集]
#匹配规则:匹配除了字符集以外的任意一个字符
re.findall('[^ 0-9]','Use 007 port')

在这里插入图片描述
注意:空格一定是一个字符

六、匹配字符串开始位置(注意区别,这个^在[]外边)

元字符:^
匹配规则:匹配目标字符串的开头位置
在这里插入图片描述

re.findall('^Jame','Hi Jame')

在这里插入图片描述
规则:^和$必须出现在正则表达式的开头结尾,如果两者同时出现,中间部分必须匹配正则表达式的全部内容
八、匹配字符重复

元字符:*

匹配规则:匹配前面的字符出现0次或多次

re.findall('wo*','wooooooo,w,wsdfasw,w')
['wooooooo', 'w', 'w', 'w', 'w']
re.findall('[A-Z][a-z]*','Hello,World,Python')
['Hello', 'World', 'Python']

元字符:+

匹配规则:匹配前面的字符出现一次或多次(即至少要有一次)

re.findall('[A-Z][a-z]+','A boy')
[]
re.findall('[A-Z][a-z]*','A boy')
['A']

元字符:?

匹配规则:匹配前面的字符出现0次或1次

re.findall('wo?','w,woooooooo,wo,wwwo')
['w', 'wo', 'wo', 'w', 'w', 'wo']
re.findall('-?[0-9]+','1800,-500')
['1800', '-500']

元字符:{n}

匹配规则:匹配前面的字符出现n次

#匹配手机号码
re.findall('1[0-9]{10}','13865134512,110,119')
['13865134512']

元字符:{m,n}

匹配规则:匹配前面的字符出现m-n次(包含m和n)

#匹配qq号
re.findall('[1-9][0-9]{5,10}','980056224,731415926,1008120088200')
['980056224', '731415926', '10081200882']

九、匹配任意(非)数字字符

元字符:\d,\D

匹配规则:\d 匹配任意数字字符,\D匹配任意非数字字符

#匹配端口
re.findall('\d{1,5}','Mysql:3306,http:80')
['3306', '80']
re.findall('\D+','Mysql:3306,http:80')
['Mysql:', ',http:']
#匹配任意数字,包括整数小数正负数
re.findall('-?\d+\.?\d*','1,2,3.5,-6')
['1', '2', '3.5', '-6']

十、匹配任意(非)普通字符

元字符:\w,\W

匹配规则:\w匹配普通字符,\W匹配非普通字符

说明:普通字符指数字、字母、下划线、汉字(utf-8字符)

re.findall('\w+','sever_port = 8888')
['sever_port', '8888']
re.findall('\W+','server_port = 8888')
[' = ']

十一、匹配任意(非)空字符

元字符:\s \S

匹配规则:\s匹配空字符,\S匹配非空字符

说明:空字符指的是空格、\r、\n、\t、\v、\f字符

re.findall('\w+\s+\w+','hello  _  world')
['hello  _']
re.findall('\S+','GADFSKLH  OLBW   87OFGIYL')
['GADFSKLH', 'OLBW', '87OFGIYL']

十二、匹配开头结尾位置

元字符:\A,\Z

匹配规则:\A表示开头位置,\Z表示结尾位置

几乎不怎么使用

十三、匹配(非)单词的边界位置

元字符:\b \B

匹配规则:\b代表单词边界 \B表示非单词边界

说明:单词边界指数字字母(汉字)下划线与其它字符的交界位置

re.findall('.\w+','python-3')
['python', '-3']
re.findall('.+','python-3')
['python-3']
re.findall(r'is','This is a test')
['is', 'is']
re.findall(r'\bis\b','This is a test')
['is']   #第二个is
re.findall(r'\Bis\b','This is a test')
['is']   #第一个is


#匹配以大写字母开头的字母
re.findall(r'[A-Z]\w+','This is iPython')
['This', 'Python']   ##iPython并不是以大写字母开头
re.findall(r'\b[A-Z]\w+','This is iPython')
['This']

十四、正则表达式的转义

1.如果使用正则表达式匹配特殊字符需要加\表示转义

.^${}[]()|
re.findall('\d+\.\d+','12.34')
['12.34']

2.在编程语言中,常使用原生字符串书写正则表达式避免多重转义的麻烦

\\$\\d+   r'\$\d+'

十五、贪婪模式与非贪婪模式

1.定义

贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容,比如:*+?{m,n}

非贪婪模式:让匹配重复的元字符尽可能少的向后匹配内容

2.贪婪模式切换为非贪婪模式

在通常情况下,在匹配重复元字符后加一个?,就可以将贪婪模式切换为非贪婪模式

re.findall(r'\d+?','dsafadff5132,864513')
['5', '1', '3', '2', '8', '6', '4', '5', '1', '3']
re.findall(r'\d+','dsafadff5132,864513')
['5132', '864513']

re.findall(r'\b.+\b','python*007')
['python*007']
re.findall(r'\b.+?\b','python*007')
['python', '*', '007']

re.findall(r'\(.*\)','(hello world),zha(tom)')
['(hello world),zha(tom)']
re.findall(r'\(.*?\)','(hello world),zha(tom)')
['(hello world)', '(tom)']

十六、正则表达式分组

1.定义

在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。

2.作用

①可以被作为整体操作,改变元数组的操作对象

re.findall(r'ab+','ababababababab')
['ab', 'ab', 'ab', 'ab', 'ab', 'ab', 'ab']
re.search(r'(ab)+','ababababababababa').group()
'abababababababab'

②可以通过某些编程语言某些接口获取匹配内容中,子组对应的内容部分

#获取url协议类型
re.search(r'(https|http|ftp|file)://\S+',"https://www.baidu.com").group(1)

3.捕获组

可以给正则表达式的子组起一个名字,表达该子组的意义。这种有名称的子组成为捕获组。

格式:(?Ppattern)

re.search(r'(?P<firstName>王|李)\w{1,3}','李时珍  王者荣耀').group('firstName')

4.注意事项

①一个正则表达式中可以包含多个子组

②子组可以嵌套,但是不要重叠或者嵌套结构复杂

③子组序列号一般从外向内,从左到右计数

十七、正则表达式的匹配原则

1.正确性,能够正确的匹配出目标字符串

2.排他性,除了目标字符串之外尽可能少的匹配其他内容

3.全面性,尽可能考虑到目标字符串的所有情况,不遗漏

十八、re模块使用

 regex = compile(pattern,flags = 0)
 功能: 生产正则表达式对象
 参数: pattern  正则表达式
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 正则表达式对象
 re.findall(pattern,string,flags = 0)
 功能: 根据正则表达式匹配目标字符串内容
 参数: pattern  正则表达式
      string 目标字符串
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
 regex.findall(string,pos,endpos)
 功能: 根据正则表达式匹配目标字符串内容
 参数: string 目标字符串
      pos 截取目标字符串的开始匹配位置
      endpos 截取目标字符串的结束匹配位置
 返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容
 re.split(pattern,string,flags=0)
 功能: 使用正则表达式匹配内容,切割目标字符串
 参数: pattern  正则表达式
      string 目标字符串
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 切割后的内容列表
s = 'hello world how are you   brother'
l = re.split(r'[^\w]+',s)
l
['hello', 'world', 'how', 'are', 'you', 'brother']
re.sub(pattern,replace,string,max,flags = 0)
 功能: 使用一个字符串替换正则表达式匹配到的内容
 参数: pattern  正则表达式
      replace  替换的字符串
      string 目标字符串
      max  最多替换几处,默认替换全部
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 替换后的字符串
s = '时间:2019/10/12'
ns = re.sub(r'/','-',s)
ns
'时间:2019-10-12'
 re.subn(pattern,replace,string,max,flags = 0)
 功能: 使用一个字符串替换正则表达式匹配到的内容
 参数: pattern  正则表达式
      replace  替换的字符串
      string 目标字符串
      max  最多替换几处,默认替换全部
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 替换后的字符串和替换了几处
s = '时间:2019/10/12'
ns = re.subn(r'/','-',s)
ns
('时间:2019-10-12', 2)
 re.finditer(pattern,string,flags = 0)
 功能: 根据正则表达式匹配目标字符串内容
 参数: pattern  正则表达式
      string 目标字符串
      flags  功能标志位,扩展正则表达式的匹配
 返回值: 匹配结果的迭代器
s = '2019年,建国70周年'
pattern = r'\d+'
#返回包含匹配结果的迭代器
l = re.finditer(pattern,s)
for i in l:
    print(i)
<re.Match object; span=(0, 4), match='2019'>
<re.Match object; span=(8, 10), match='70'>
##返回值为match对象
re.fullmatch(pattern,string,flags=0)
功能:完全匹配某个目标字符串
参数:pattern 正则
	string  目标字符串
返回值:匹配内容match object
re.match(pattern,string,flags=0)
功能:匹配某个目标字符串开始位置
参数:pattern 正则
	string  目标字符串
返回值:匹配内容match object
re.search(pattern,string,flags=0)
功能:匹配目标字符串第一个符合内容
参数:pattern 正则
	string  目标字符串
返回值:匹配内容match object

compile对象属性

【1】 flags : flags值
	re.I    IGNORECASE, 忽略大小写的匹配模式
	re.M    MULTILINE,多行模式, 改变 ^ 和 $ 的行为
	re.S   DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符,也就是默认是不能匹配换行符
	re.X    VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释
	
【2】 pattern : 正则表达式
【3】 groups : 子组数量
【4】 groupindex : 捕获组名与组序号的字典

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值