Python——正则、转义、re、匹配、贪婪和非贪婪(day13)

目录

一、正则表达式

二、re模块

三、匹配规则

四、re模块其他方法

4.1 re.compile 

4.2 re.search

4.3 re.findall

4.4 re.sub和re.subn

4.5 re.split

五、贪婪与非贪婪模式

六、小结


一、正则表达式

 

二、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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清园暖歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值