python笔记-day14-正则

前言
python语法学习,留给需要的人,懂得都懂!!

# coding=utf8
# @time:2022/4/22 20:14
# Author 浩宇


# re模块是python内置的专门用来提供处理正则表达式函数的模块
from re import fullmatch,findall,search

# 一、正则表达式匹配符号
# 1.什么是正则表达式
# 正则表达式是一种可以让字符串处理变的很简单的工具
# 正则表达式就是通过各种正则符号来描述字符串的规则
# 在不同的编程语言中,正则的语法是相同的,但是表示方式不同:如python  -   ‘正则表达式’;js   -   /正则表达式/

# 2.正则符号
# 1)普通字符    -   普通字符在正则表达式中表示这个字符本身
# fullmatch(正则表达式,字符串)  -   判断字符串是否符合正则所描述的规则,如果符合返回结果是None,否则是None
'''''''''
re_str='abc'    # 规则:一个字符串有三个字符,分别是a,b,和c
result = fullmatch(re_str,'abc')
print(result)
'''''''''

# 2)特殊字符
# 第一个: . -   表示匹配一个任意字符
'''''''''
'a.b'   -   表示匹配一个长度是三,第一个是a,最后一个是b,中间是任意字符串
re_str = 'a.b'
result = fullmatch(re_str,'a+b')
print(result)   # <re.Match object; span=(0, 3), match='a+b'>

# ’xy..‘    -   表示匹配长度为4,前两位是xy,后两位为任意字符的字符串
'''''''''

# 第二个:\d    -   匹配一个任意数字
'''''''''
re_str = 'a\db'    # 匹配一个长度为3,第一个是a,最后一个是b,中间是任意的一个数字的字符
result = fullmatch(re_str,'a5b')
print(result)   # <re.Match object; span=(0, 3), match='a5b'>
'''''''''

# 第三个:\s    -   匹配一个空白字符
# 空白字符:‘空格’、‘\n(相当于回车)’、‘\t(相当于tab键)’
'''''''''
re_str = 'abc\s123'
result = fullmatch(re_str,'abc 123')
print(result)   # <re.Match object; span=(0, 7), match='abc 123'>
'''''''''

# 第四个:\w(了解)    -   匹配一个字母、数字、下划线(ASCII码表以外的字符都可以匹配)
'''''''''
re_str='\d\w\d'
result = fullmatch('re_str','2看8')
print(result)   # None
'''''''''

# 第五个:\D    -   匹配一个任意的非数字字符
'''''''''
re_str = 'a\Db'
result = fullmatch(re_str,'aab')
print(result)   # <re.Match object; span=(0, 3), match='aab'>
'''''''''

# 第六个:\S    -   匹配一个任意非空白字符
'''''''''
re_str = 'a\Sb'
result = fullmatch(re_str,'acb')
print(result)   # <re.Match object; span=(0, 3), match='acb'>
'''''''''

# 第七个:[字符集]     -   匹配字符集中出现的任意一个字符
'''''''''
注意:a.一个[]只能匹配一个字符
     b.在[]中可以将-放在两个字符中间表示范围,但是-前面的编码值必须小于后面的字符的编码值
     c.在[]中-只有在两个字符中间才有意义(表示范围),在最前面和后面都表示-本身
     
[a1+]   -   匹配字符a或者1或者字符+。
[\dxy]  -   匹配任意一个数字或者x或者y。
[1-9]   -   匹配1到9的任意一个数字。
[a-z]   -   匹配任意一个小写字母
[A-Z]   -   匹配任意一个大写字母
[\u4e00-u9fa5]  -   匹配任意一个中文字符

[a-z+=\]    -   匹配任意一个小写字母或者+或者=或者\
'''''''''

'''''''''
re_str= 'a[xyz]b'   # 匹配一个长度是3,第一个字符是a,第三个字符是b,中间是xyz中任意一个字符
result = fullmatch(re_str,'axb')
print(result)
'''''''''


# 第八个:[^字符集]    -   匹配的是非字符集中的任意一个字符
'''''''''
[^abc]  -   匹配除了abc以外的任意字符
[^\d]   -   匹配除了数字以外的任意字符
[^a-z]  -   匹配任意一个非小写字母的字符
注意:如果把^放在字符集中间或者后面,则表示^本身;

re_str = '\d[^abc]\d'
result = fullmatch(re_str,'374')
print(result)   # <re.Match object; span=(0, 3), match='374'>
'''''''''




# 二、检测类符号
# 匹配类的符号,一个符号需要对应一个字符;检测类符号不影响字符串长度,只是在匹配成功后检测符号所在的位置是否符合要求;
# 1.
# \b  -   检测是否是单词边界
# \B    -   检测没有单词边界
# 单词边界:生活中可以将两个单词区分开来的字符。例如:空格(空白)、逗号等标点符号、字符串开头和字符串结尾
'''''''''
re_str = r'abc,\b123'  # r可以不让转义字符转义,不影响正则
result = fullmatch(re_str,'abc,123')
print(result)   # <re.Match object; span=(0, 7), match='abc,123'>
注意:先看能不能匹配成功,再看,后面是否有单词边界;或者看1前面是否有单词边界,上面后者符合故可以检测成功
'''''''''

# 2.^   -   检测字符串开头
'''''''''
re_str = '^\d\d\d'
result = findall(re_str,'123asd')
print(result)   # ['123']
'''''''''

# 3.$   -   检测是否是字符串结尾
'''''''''
re_str = '\d\d\d$'
result = findall(re_str,'sd123')
print(result)   # ['123']
'''''''''


# 三、控制匹配次数
# 1.+   -   一次或多次(至少一次)
'''''''''
a+  -   字符a出现一次或者多次(至少出现一次a)
\d  -   匹配一次或者多次任意数字字符
.+  -   匹配一次或者多次任意字符

re_str = 'xa+y'
result = fullmatch(re_str,'xaay')
print(result)   # <re.Match object; span=(0, 4), match='xaay'>

re_str = 'x\d+y'
result = fullmatch(re_str,'x12y')
print(result)   # <re.Match object; span=(0, 4), match='x12y'>
'''''''''

# 2.*   -   匹配0次或者多次(任意次数)
'''''''''
re_str = 'xa*y'
result = fullmatch(re_str,'xaaaaaay')
print(result)   # <re.Match object; span=(0, 8), match='xaaaaaay'>
'''''''''

# 3.?   -   匹配0次或一次
'''''''''
re_str = 'xa?y'
result = fullmatch(re_str,'xay')
result1 = fullmatch(re_str,'xy')
print(result)   # <re.Match object; span=(0, 3), match='xay'>
print(result1)  # <re.Match object; span=(0, 2), match='xy'>
'''''''''

# 4.{}  -
'''''''''
1){N}   -   匹配N次
2{M,N} -   匹配M到N次([m,n]3{M,}  -   匹配至少M次
4{,N}  -   匹配最多N次
'''''''''

# (重要!)5.贪婪非贪婪
# 在匹配次数不确定的时候,匹配分为贪婪和非贪婪两种,默认都是贪婪的.
# 1)贪婪:匹配次数不确定的时候默认贪婪(+  *  ?)
# 在能匹配成功的前提下,取匹配次数最多的结果.(假设3次\4次\6次都能匹配成功,最后取6次)

# re_str = r'a.+b'
# print(findall(re_str,'amsnbsdhdnb'))    # ['amsnbsdhdnb']

# 2)非贪婪:匹配次数不确定的时候次数后面加'?'(+?  *?   ??)
# 在能匹配成功的前提下,取匹配次数最少的结果.(假设3次\4次\6次都能匹配成功,最后取3次)

# re_str = r'a.+?b'
# print(findall(re_str,'amsnbsdhdnb'))    # ['amsnb']


# 四、分支分组
# 1.()  -   分组
# 分组就是将正则表达式中的某部分用()括起来看成一个整体,然后进行整体操作
# 在正则表达式中一个()表示一个分组
'''''''''
# 1)整体操作
print(fullmatch('(\d{2}[a-z]{3})+','22asd'))    # <re.Match object; span=(0, 5), match='22asd'>

# 2)整体重复
\M  -   表示重复且前面第M个分组匹配到的内容
print(fullmatch(r'(\d{2})ab\1','22ab22'))   # <re.Match object; span=(0, 6), match='22ab22'>

# 3)筛选

'''''''''

# 2.|   -   分支
'''''''''
# 练习:写一个正则表达式,能够匹配一个字符串是:abc后面是三个任意数字或者三个任意大写字母?
# 'ABC827'、'abcKNM'
re_str = '(abc\d{3})|([A-Z]{3})'
print(fullmatch(re_str,'ASD'))  # <re.Match object; span=(0, 3), match='ASD'>
'''''''''

# 3.转义符号
# 在正则中有特殊意义的付好钱加 \ 让这个符号的功能消失,表示这个符号的本身
# re_str = '\d{2}\.a'   - 表示2个数字后米娜一个点,最后是一个a

# 注意:除了在[]中有特殊意义的符号(^、-)外,其他的符号在[]里面都表示符号本身




from re import fullmatch,match,search,findall,split,sub
# 五、re模块
# 1.fullmatch(正则表达式,字符串)    - 判断字符串和正则表达式是否完全匹配;如果可以匹配返回匹配对象,否则返回None;
# 2.match(正则表达式,字符串)    - 判断字符串的开头是否和正则匹配;如果可以匹配返回匹配对象,否则返回None;
'''''''''
re_str = '\d{3}'
print(match(re_str,'123asd asd'))   # <re.Match object; span=(0, 3), match='123'>
'''''''''
# 3.search(正则表达式,字符串)   - 获取这个字符串中第一个满足正则表达式的字符串;如果可以匹配返回匹配对象,否则返回None;
'''''''''
re_str = '\d{3}'
print(match(re_str,'123asd321asd')) # <re.Match object; span=(0, 3), match='123'>
'''''''''
# 4.findall(正则表达式,字符串)  - 获取字符串中所有满足正则表达式的子串,返回一个列表
'''''''''
print(findall('\d{3}','123asd432123'))  # ['123', '432', '123']
'''''''''

# 5.split(正则表达式,字符串)    - 将字符串中所有满足正则表达式的子串作为切割点,对字符串进行切割.
'''''''''
print(split('[ab]','dsadbdsfe'))    # ['ds', 'd', 'dsfe']
'''''''''

# 6.sub(正则表达式,字符串1,字符串2)  - 将字符串2中满足正则表达式的子串都替换成字符串1
'''''''''
print(sub('\d','+','jiushi123'))    # jiushi+++
'''''''''

更多安全分享,请关注【安全info】微信公众号!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪法师12

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

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

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

打赏作者

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

抵扣说明:

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

余额充值