目录
一、正则表达式
二、re模块
# 通过python中的re模块的使用最终掌握正则表达式的常用匹配规则
# group(num) 可以获取匹配的数据 如果有多个匹配结果的话 那么会以元组的形式 存放到group对象中,
# 此时我们可以通过下标去获取
import re
strData = 'Python is the best language in the world'
# match 只能匹配以xxx开头的子符串,第一个参数是正则,第二个参数是需要匹配的字符串
# res = re.match('python',strData,re.I|re.M) #第三个参数 I 表示忽略大小写
res = re.match('(.*) is (.*?) .*',strData,re.I|re.M)
if res:
print('匹配成功...')
# print(res)
print(res.groups())
print(res.group(1))
print(res.group(2))
else:
print(res.group()) #如果匹配失败 是没有group函数的 因为是一个空对象None
print(res)
print('匹配失败...')
三、匹配规则
# . 点的使用 匹配规则是除了 换行符之外的字符
import re
# data='a1aaa'
# names='李达','李明','小王','小李'
# pattern='李.' #匹配规则
# parrtern='...'#匹配规则
# for name in names:
# res=re.match(pattern,name)
# if res:
# print(res.group())
# []中括号的使用 匹配规则是:匹配中括号中的任意一个字符
# str1='eHello'
str1='eee'
# res=re.match('[he]',str1)
# res=re.match('[He]',str1)
# print(res.group())
# pattern='[abc]' #使用中括号括起来的内容, 代表一个集合,代表匹配集合内的任意一个字符
pattern='[a-z]' #可以简写一个范围abcdefg
# [abc]代表可以匹配a或者b或者c
# datas='a','b','c','e','wyw'
# for data in datas:
# result=re.match(pattern,data)
# if result:
# print('匹配成功 %s'%result.group())
# \d 匹配一个数字 0-9
# data='12345abcdef'
# print(re.match('\d\d\d',data).group())
# \D 匹配一个非数字
# data='W12345abcdef'
# print(re.match('\D',data).group())
# \s 匹配一个空白字符 或者tab键
# data=' hello'
# print(re.match('\s\s',data).group())
# \S 匹配非空白字符
# data='Pthon hello'
# print(re.match('\S\S\S\S\S',data).group())
# \w 匹配单词字符,即a-z、A-Z、0-9、_
# data='_2Yssdf'
# print(re.match('\w\w',data).group())
# \W 匹配非[a-z、A-Z]单词字符
data='@$# _2Yssdf'
print(re.match('\W\W',data).group())
# * 匹配前一个字符出现0次或者无限次,即可有可无
import re
# res=re.match('[A-Z][A-Z]*','Ay') 匹配0次
# # res=re.match('[A-Z][a-z]*','Any') 匹配了2次
# res=re.match('[A-Z][a-z]*','Anyeverydayhappyislaveer') #可以匹配无限次
# print(res.group())
# + 匹配前一个字符出现1次或者无限次,即至少有1次
# res=re.match('[a-zA-Z]+','MYNAMEisfjksg')
# 匹配符合规范【规则是:不能以数字开头,只能包含字母、数字、下划线】的python变量命名
# result=re.match('[a-zA-Z_]+[\w]*','name')
# result=re.match('[a-zA-Z_]+[\w]*','_name')
# result=re.match('[a-zA-Z_]+[\w]*','na99m_e')
# print(result.group())
# ? 告诉引擎匹配前导字符 0 次或者一次,事实上表示前导字符是可以选择的
# result=re.match('[a-zA-Z]+[0-9]?','nameFunck99m_e')
# print(result.group())
# {min,max} 告诉引擎匹配前导字符min次到max次 ,min和max必须都是非负整数
# {count} 精确匹配
# result=re.match('\d{4}','1234567890')
# {min,} max被省略的话 表示max没有限制了
# result=re.match('\d{4,}','123423542355673623623473457890')
# result=re.match('\d{4,8}','1234567898888')
# if result:
# print('匹配成功 {}'.format(result.group()))
# pass
# 匹配邮箱demo 格式xxxxxx@163.com
# regexMail=re.match('[a-zA-Z0-9]{6,11}@163.com','wanghua123uuu@163.com')
# if regexMail:
# print('匹配成功 {}'.format(regexMail.group()))
# pass
# mypath = 'G:\\py资料\\1-上课资料\\4-正则表达式课件\\html'
# print(mypath) # 路劲输出异常
# print(re.match('c:\\\\a.txt','c:\\a.txt').group())
# print(re.match(r'c:\\a.txt','c:\\a.txt').group()) #在正则前面加 r 表示原生的字符串,python字符串就不转义
# ^ 匹配字符串的开头
# result=re.match('^P.*','Python is langage')
# result=re.match('^P\w{5}','Python is langage')
# if result:
# print(result.group())
# $ 匹配邮箱的结尾
result=re.match('[\w]{5,15}@[\w]{2,5}.com$','myfunckmail@mail.comTest')
if result:
print(result.group())
pass
# | 竖线 匹配左右任意一个表达式 实际上是一个 或 的关系
import re
# string='wywsqpeng'
# # rs=re.match('(wywsqpeng|wywsqpeng888)',string)
# rs=re.match('(wywsqpeng888|wywsqpeng)',string)
# print(rs.group())
# (ab) 分组匹配 将括号中字符作为一个分组
# 匹配电话号码 xxxx-123456789
# ^ 有两种含义 1:以xxxx开头 2:否定 取反
# ^如果出现在[ ]中的首位则表示匹配不包含其中任意字符,如果出现在字符中间就仅作为普通字符
# res=re.match('([^-]*)-(\d*)','021-456213987')
# print(res.group(0))
# print(res.group(1))
# print(res.group(2))
# \num 的使用 引用分组num匹配到的字符串
# htmlTag='<html><h1>测试数据</h1></html>'
# res=re.match(r'<(.+)><(.+)>(.+)</\2></\1>',htmlTag)
#
# print(res.group(1))
# print(res.group(2))
# print(res.group(3))
# 分组 别名的使用 (?P<名字>)
# 如何使用别名 (?P=引用的名字)
data='<div><h1>www.baidu.com</h1></div>'
res=re.match(r'<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>',data)
print(res.group())
四、re模块其他方法
4.1 re.compile
4.2 re.search
4.3 re.findall
4.4 re.sub和re.subn
re.subn :还返回被替换的数量,以元组的形式
4.5 re.split
# compile re模块中的编译方法 可以把一个字符串编译成字节码
# 优点: 在使用正则表达式进行 match的操作时,python会将字符串转为正则表达式对象,
# 而如果使用complie则只需要完成一次转换即可,以后再使用模式对象的话 无需重复转换,
import re
# reobj=re.compile('\d{4}')
# # 开始去使用模式对象reobj
# rs=reobj.match('1235678')
# print(rs.group())
#
# print(re.match('\d{4}','1235678').group())
# re.search 规则是:在全文中匹配一次,匹配到就返回
# data='我爱伟大的祖国,I love China,China is a great country'
# rs=re.search('China',data)
# print(rs)
# print(rs.group())
# print(data[19])
# print(data[20])
#re.findall() 查询字符串中某个正则表达式全部的非重复出现的情况 返回的是一个符合正则表达式的结果列表
data='华为是华人的骄傲华侨'
rs=re.findall('华.',data)
rsearch=re.search('华.',data)
# print(rsearch)
# 改造一下使用compile
# reobj=re.compile('华.') #创建一次正则对象转换
# print(reobj.search(data))
# print(reobj.findall(data))
# re.sub 实现目标的搜索和替换
# re.subn 实现目标的搜索和替换 还返回被替换的数量 以元组形式
# dataS='Python是很受欢迎的编程语言Python'
# pattern='[a-zA-Z]+' #字符集的范围 + 号 代表 前导字符模式出现1次以上
# res=re.sub(pattern,'Java',dataS)
# resn=re.subn(pattern,'Java',dataS)
# print(res)
# print(resn)
# re.split 实现分割字符串
data='百度,腾讯,阿里,华为,360'
rs=re.split(',',data)
print(type(rs))
print(rs)
五、贪婪与非贪婪模式
六、小结
内容小结
元字符 说明 正确 错误
\d 匹配任意单个数字 2 i、$
\D 匹配非数字 A/a 3
\w 匹配任意单个字母数字下划线 u &
\W 匹配\w之外的任意单个字符 & u
\s 匹配单个空格 x
\S 匹配非空白,除空格,tab键之类 x
\n 匹配换行符
. 匹配任意单个字符【换行符除外】
\num 匹配前面引用的分组
多次的重复匹配
正则表达式 说明 正确 错误
A{3} 精准N次匹配 AAA AA|A|AAAA
A{3,} 最少出现n次 AAA A
\d{3,5} 约定出现最少次数和最大次数
\d* 可以出现0次至无限次 相当于{0,}
\d+ 最少出现一次 相当于{1,}
\d? 最多出现一次 相当于{0,1} 1 12
定位匹配
正则表达式 说明 正确 错误
^A.* 头匹配 ABC CBA
.*A$ 尾部匹配 CBA ABC
^A.*A$ 全字匹配 ACCA BAAA
字符的范围匹配
正则表达式 说明 正确 错误
A 精准匹配 A a
x|y 匹配左右两边的字符 x/y n
[xyz] 字符集合允许出现集合内任意单个字符 z、x、y c、b
[a-z][A-Z][0-9] 字符范围
[^xyz][^0-9] 取反 集合内字符不允许出现的 0 A y8
贪婪模式
在满足条件的情况下尽可能的去匹配多的字符串
实例:111222333 \d{6,8}
数据 :小王出生于1997年 .*\d{4}年 贪婪模式
非贪婪模式
在满足条件的情况下尽可能的去匹配少的字符串
实例:111222333 \d{6,8}?
数据 :小王出生于1997年 .*?\d{4}年 贪婪模式
import re
# 1、'Save your heart for someone who cares' 请使用正则将文本中的"s"替换成"S",请写Python代码完成匹配替换。
data='Save your heart for someone who cares'
# res=re.subn('s','S',data)
# print(res)
# 2、'<span>三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>' 请使用正则将<span>标签中的全部内容匹配出来
# ,请写Python代码完成匹配
data='<span>三生三世,十里桃花</span><span>九州海上牧云记</span><span>莫斯科行动</span>'
#分组别名的用法
patternNick=r'<(?P<A>\w*)>(.*)</(?P=A)><(?P=A)>(.*)</(?P=A)><(?P=A)>(.*)</(?P=A)>'
reobj=re.compile(patternNick)
# reobj=re.compile(r'<span>(.*)</span><span>(.*)</span><span>(.*)</span>')
result=reobj.findall(data)
print(result)