Python--第二阶段--05.正则表达式

正则表达式

目的

  1. 文本处理已经成为计算机常见工作之一;
  2. 对文本内容的搜索,定位,提取是逻辑比较复杂的工作;
  3. 为了快速方便的解决上述问题,产生了正则表达式技术。

简介

  1. 定义
    即文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。
  2. 原理
    通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进行匹配。
  3. 目标
    • 熟练掌握正则表达式元字符
    • 能够读懂常用正则表达式,编辑简单的正则规则
    • 能够熟练使用re模块操作正则表达式

元字符使用

元字符:有特殊含义的字符
在这里插入图片描述
图片来自网络,如有违权请留言,我一定第一时间删除~

匹配字符的元字符

用途元字符例子(直接复制运行需要把‘’改成英文的)备注
任意一个字符.re.findall(‘张.’,‘张三 张晓峰’)除换行符外
字符集[字符集]re.findall(’[aeiou]’,‘hello world’)[abcd][0-9]/[a-z],[^]代表除了[]里面的都可以
任意数字字符或非数字字符\d \Dre.findall(’\d{1,5}’,‘Mysql:3306,http:80’)[0-9]和 [ ^0-9] 作用一样
任意普通字符或非普通字符/w /Wre.findall(’\w+’,‘Mysql=3306 http=80’)数字、字母、下划线、汉字及普通的UTF8字符
任意空字符或非空字符\s \Sre.findall(’\S+’,‘hello wolrd\tshe is a pig’)空字符包括空格、\r 、\n、\t、\v、\f

匹配重复的元字符

用途元字符例子(直接复制运行需要把‘’改成英文的)备注
出现0次或多次*re.findall(‘wo*’,‘wooooo~w!’)
出现1次或多次+re.findall(’[a-zA-Z]+’,‘James,hello’)
出现0次或1次?re.findall(’-?[0-9]+’,‘12 32 -99 100’)
出现n次{n}re.findall(’[0-9]{11}’,‘jams:13555555555’)出现n次
出现m-n次{m,n}re.findall(’[0-9]{6,12}’,‘QQ1:123456 \n QQ2:458106428’)出现m到n次

匹配位置的元字符

用途元字符例子(直接复制运行需要把‘’改成英文的)备注
开头^ 或 \Are.findall(’^James’,‘James,hello’)在字符串开头
结尾$ 或 \Zre.findall(‘James$’,‘hi,James’)在字符串结尾
单词边界或非单词边界\b \Bre.findall(r’\bis\b’,‘This is a pig, is this?’)r是为了避免Python转义,单词边界即空格,开头,结尾,标点符号

其他元字符

用途元字符例子(直接复制运行需要把‘’改成英文的)备注
|re.findall(‘ab|cd’,‘abcdefg’)前后两个条件满足一个就可以
分组()re.search(r’(王|李)\S{1,4}’,‘王者荣耀 赵丽颖’).group()只改变重复元字符的作用对象,并且可以通过函数获取子组内容
特殊字符\re.findall(’$\d+’,’$100 $2000’)如果匹配的字符和任意元字符相同,那就要在字符前加\

转义问题

匹配特殊字符时,加\
由于Python会将字符串中的带\的字符转义,造成了我们写正则表达式的时候会少\,所以产生了原生字符串的概念。
Python中原生字符串:在字符串前面加r,则字符串中的特殊字符(\r,\t,\n,\v,\f)不转义。

贪婪模式和非贪婪模式

贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如*?+{m,n}等。
非贪婪模式:在匹配元字符后加个?就转换为非贪婪模式了,匹配少的一个
eg:

贪婪模式(尽可能多的)非贪婪模式(尽可能少的)
re.findall(r’ab*’,‘abbbbbbbbbbcd’)re.findall(r’ab*?’,‘abbbbbbbbbbcd’)
re.findall(r’ab+’,‘abbbbbbbbbbcd’)re.findall(r’ab+?’,‘abbbbbbbbbbcd’)
re.findall(r’ab{3,5}’,‘abbbbbbbbbbcd’)re.findall(r’ab{3,5}?’,‘abbbbbbbbbbcd’)
re.findall(r’ab*’,‘abbbbbbbbbbcd’)re.findall(r’ab*?’,‘abbbbbbbbbbcd’)

正则表达式的原则

  1. 正确性:能够正确的匹配出目标字符串。
  2. 排他性:尽可能少的匹配其他内容。
  3. 全面性:尽可能考虑到目标字符串的所有情况,不遗漏。

Python中的re模块

产生正则表达式对象的函数

compile:生成正则表达式对象
	regex = re.compile(pattern,flags = 0)
	参数:pattern 正则表达式、flags 功能标志位,扩展正则表达式的匹配
	返回值:正则表达式对象

正则表达式对象的方法和re的方法

正则表达式对象和re均有相同的方法,只是参数有不同,下面以findall为例,其余函数均相似:

正则表达式对象和re都可用的方法

findall:根据正则表达式匹配目标字符串内容
	list_re = re.findall(pattern,string,flags = 0)
	re_obj = regex.findall(string,pos,endpos)
	参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配,pos截取目标函数的开始匹配位置,endpos截取目标字符串的结束匹配位置,默认从头到尾。
	返回值:匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容。
import re
s = "alex:1994,ping:1998"
pattern = r"\w+:\d+"

# re方法直接调用findall
l = re.findall(pattern,s)
print(l)

# compile对象调用findall方法
regex = re.compile(pattern)
l = regex.findall(s)
print(l)

# compile对象调用findall方法,并传参
m = regex.findall(s,0,12)
print(m)
split:使用正则表达式匹配内容,切割目标字符串
	表达式:re_list = re.split(pattern,string,flags = 0)
	参数:参数:pattern 正则表达式、flags 功能标志位,扩展正则表达式的匹配
	返回值:切割后的内容列表
import re
s = "alex:1994,ping:1998"
n = re.split(r'[:,]',s)  # 用冒号和逗号分隔
print(n)
sub:使用一个字符串替换正则表达式匹配到的内容
	re_str = re.sub(pattern,replace,string,max,flags = 0)
	参数:pattern 正则表达式、replace替换的字符串,string目标字符串,max最多替换几处,默认替换全部,flags 功能标志位,扩展正则表达式的匹配
	返回值:替换后的字符串。
subn和sub相同,知识返回值多了一个替换了几处。
import re
s = "alex:1994,ping:1998"
n = re.sub(r':','-',s)  # 用-替换所有的:
print(n)
e = re.subn(r':','-',s)
print(e)

正则表达式对象的属性方法

产生match对象的函数

产生match对象的函数–re和正则表达式对象都可使用

finditer:
	re_iter = re.finditer(parttern,string,flags = 0)
	参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
	返回值:返回一个匹配结果的可迭代match对象。
import re
s = "今年是2019年,见过70周年"
pattern = r'\d+'
# 返回迭代match对象
it = re.finditer(pattern,s)
for i in it:
    print(i)
    print(i.group()) # 获取match对象对应的内容
fullmatch:完全匹配某个目标字符串,正则表达式必须完全匹配目标字符串
	re_match = re.fullmatch(pattern,string,flags=0)
	参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
	返回值:匹配不到内容返回none,匹配到内容则返回match对象。
import re
s = "今年是2019年,建国70周年"
# 返回match对象
it = re.fullmatch(r'[,\w]+',s)  # 主要,需要和字符串里的,一致。
print(it.group())
match:匹配某个目标字符串开始位置,相当于在字符串前加了^
	re_match = re.match(parttern,string,flags = 0)
	参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
	返回值:返回匹配内容的match对象
import re
s = "今年是2019年,建国70周年"
# 匹配目标字符串的开始位置
it = re.match(r'[\w]+',s)
print(it.group())
search:匹配第一个符合正则表达式的内容
	re_match = re.seach(pattern,string,flags=0)
	参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
	返回值:返回匹配内容的match对象
import re
s = "今年是2019年,建国70周年"

it = re.search(r'[\w]+',s)
it1 = re.findall(r'[\w]+',s)
print(it.group())
print(it1)

match对象的属性方法

import re
pattern = r"(ab)cd(?P<pig>ef)"
regex = re.compile(pattern)    # 生成正则表达式对象
match_obj = regex.search('abcdefghi',0,8)    # 生成match对象

# match的属性变量
print(match_obj.pos)  # 目标字符串的开始位置
print(match_obj.endpos)   # 目标字符串的结束位置
print(match_obj.re)  # 正则
print(match_obj.string) # 目标字符串
print(match_obj.lastgroup)  # 最后一组的组名
print(match_obj.lastindex)  # 最后一组的序列号

# match对象的属性方法
print(match_obj.span())  # 匹配内容在字符串中的位置
print(match_obj.start())  # 起始位置
print(match_obj.end())   # 终止位置
print(match_obj.groupdict()) # 生成捕获组的字典
print(match_obj.groups())   # 子组对应内容的元组
print(match_obj.group()) # 获取match对象的内容,如果传入组号或者组名,则返回对应组的内容
print(match_obj.group(1))
print(match_obj.group('pig'))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值