day17 - 正则 - 学习总结

day 17 正则

问题:什么是正则表达式?
  • 正则表达式是一个可以让复杂的字符串问题变得简单的工具

正则函数:

*首先导入模块:from re import ,再使用函数:

  • 正则表达式 — python中用字符串(带r的字符串)来表示一个正则表达式
  • 结果为None则不匹配,其他结果为匹配
函数使用效果
fullmatch(正则表达式,字符串)让正则表达式和指定的字符串进行完全匹配(判断整个字符串是否符合正则表达式所描述的规则)
match(正则表达式,字符串)匹配字符串开头
search(正则,字符串)匹配字符串中第一个满足正则的子串
findall(正则,字符串)获取字符串中所有满足正则的子串
sub(正则,字符串1,字符串2)将字符串2中所有满足正则的子串都替换成字符串1
split(正则,字符串)将字符串中所有满足正则的字串作为切割点对字符串进行切割
result = fullmatch('\d{3}', '123')
print(result)    # '123'

result = match('\d{3}', '123化考核分用以834ysshjkfh')
print(result)    # '123'

result = search('\d{3}', '阖家安康会234受到罚829款shfjka')
print(result)    # '234'

result = findall('\d{3}', '阖家安康会234受到罚822026款shf278jka')
print(result)      # ['234', '822', '026', '278']

01. 正则匹配符号

匹配符号匹配含义
普通字符在正则表达式中表示符号本身的字符
.可以匹配任意一个字符
\d匹配任意一个数字
\s匹配任意一个空白字符(包括:空格、回车(\n)、水平制表符(\t))
\w匹配任意一个数字、字母、下划线或者中文
\D、\S、\W反斜杠后面跟大写字母和对应的小写字母的功能相反
[ 字符集 ]匹配在字符集中的任意一个字符
[ ^ 字符集 ]和 [ 字符集 ] 的匹配方式恰好相反;
1.普通字符 — 在正则表达式中表示符号本身的字符
result = fullmatch(r'abc','bac')
print(result)      # 不匹配   (因为结果为None)
result = fullmatch(r'abc','abc')
print(result)      # 匹配
2. .(#点) — 可以匹配任意一个字符
result = fullmatch(r'a.c','a+c')
print(result)      # 匹配

result = fullmatch(r'a.c','abc')
print(result)      # 匹配
3. \d — 匹配任意一个数字
result = fullmatch(r'a\d\dc','a13c')
print(result)      # 匹配
4. \s — 匹配任意一个空白字符
  • 空白字符:可以产生空白效果的字符,包括:空格、回车(\n)、水平制表符(\t)
result = fullmatch(r'a\sc','a c')
print(result)      # 匹配
5. \w — 匹配任意一个数字、字母、下划线或者中文
result = fullmatch(r'a\wc','a_c')
print(result)      # 匹配
6. \D、\S、\W — 和小写的 \d、 \s、\w 的匹配方式恰好相反
result = fullmatch(r'a\Dc','a的c')
print(result)      # 匹配

result = fullmatch(r'a\Sc','a3c')
print(result)      # 匹配

result = fullmatch(r'a\Wc','a=c')
print(result)      # 匹配
7. [字符集] — 匹配在字符集中的任意一个字符
用法1:中括号中直接写多个普通字符,例如:[ ma1, ]
用法2:中括号中包含反斜杠开头的特殊符号,例如:[ ma1, \d ]
用法3:中括号中减号放在两个字符之间表示范围,例如[1-7]、[a-z]、[A-Z]、[a-zA-Z]、[mn1-7]、[\u4e00-\u9fa5]等。

注意:

  1. 中的 - 需要在两个字符之间,才表示字符1-字符2的区间,并且减号前面的字符的编码值必须小于减号后面的字符的编码值;
  2. 中的 - 如果不在两个字符之间,- 就是一个普通符号,表示这个符号本身。
result = fullmatch(r'a[ma1,]c', 'amc')
print(result)

result = fullmatch(r'a[m\da,]c', 'a0c')
print(result)
8. [ ^ 字符集] — 和 [字符集] 的匹配方式恰好相反;匹配任意一个不在字符集中的任意一个字符

注意:[ ]中,如果不在最前面,就表示这个符号本身

result = fullmatch(r'a[^MNX]c', 'aOc')
print(result)

result = fullmatch(r'a[^1-9]c', 'a胡c')
print(result)

02 正则匹配次数

匹配次数符号用法+扩展匹配含义
+用法:匹配符号+匹配一次或多次(至少一次)
*用法:匹配符号*匹配0次或多次(任意次数)
用法:匹配符号?匹配0次或者1次
{ }{N}匹配N次
{M,N}匹配M到N次
{M,}至少匹配M次
{ ,N}最多匹配N次

字符集+匹配次数符号:代表字符集内任意一个或多个字符都可以匹配相应次数

匹配符号+:
例如:
result = fullmatch(r'a+b','aaaab')    # 可以匹配N个a
print(result)
result = fullmatch(r'.+b','sdfdsfb')  # .+  可以多次匹配任意一个字符
print(result)

result = fullmatch(r'[MN1-6]+b', '3M5N16Nb')
print(result)    # [MN1-6]+,表示字符集内的字符都可以匹配一次或多次
匹配符号{}:

练习1:写一个正则可以匹配任意一个整数字符串
'1923''-234''+234''2''-2'-    合法
'agg2''23.23'  '001'     -    不合法
0 不考虑

str1 = '+6272'
result=fullmatch(r'[-+]?[1-9]\d*',str1)
if result:
    print('合法')
else:
    print('不合法')

练习2:写一个正则表达式匹配一个变量名,变量名要求:由数字、字母下划线组成,数字不能开头
name='9ab2c'
result=fullmatch(r'[a-zA-z_][a-zA-z_\d]*',name)
if result:
    print('合法')
else:
    print('不合法')

03 贪婪和非贪婪

  • 在匹配次数不确定的情况下,匹配模式分为贪婪和非贪婪两种
1)贪婪
  • 在能匹配成功的前提下,如果有多种次数都能匹配成功取最大次数
  • +、*、?、{M,N}、{M,}、{,N}
2)非贪婪
  • 在能匹配成功的前提下,如果有多种次数都能匹配成功取最小次数
  • +?、*?、??、{M,N}?、{M,}?、{,N}?
result = match(r'a.+b', 'amnb数据复baab计算机')
print(result)    #  match='amnb数据复baab'

result = match(r'a.+?b', 'amnb数据复baab计算机')
print(result)     #  match='amnb'

04 分组和分支

1. 分组: ( )
一个() 就是一个分组
1)整体控制 - 将正则中,需要看成一个整体来控制次数的地方,用()括起来,作为一个分组;
2)重复 - 在正则中,可以通过 \M来重复它前面第M个分组匹配到的结果
案例:匹配,"23a23,34b34"
result=fullmatch(r'(\d\d)a\1','80a80')
print(result)     # 匹配

result=fullmatch(r'(\d{2})([A-Z]{3})-\1\1\2','23MNB-2323MNB')
print(result)      # 匹配
3) 捕获 - 获取指定分组中( )的匹配结果(findall会自动捕获分组内容)
result=findall(r'(\d{3})[a-z]{3}','123hauyk232kjkjjk184')
print(result)   # ['123', '232']
#  基于(\d{3})[a-z]{3} 获取(\d{3}),所以没有结尾的184
2. 分支

正则1|正则2 - 字符串如果可以和两个正则中的任意一个正则匹配成功就能匹配成功,两个都不能匹配就匹配失败

result=fullmatch(r'abc(\d{3}|[A-Z]{2})','abcMN')
print(result)
# <re.Match object; span=(0, 5), match='abcMN'>

result=fullmatch(r'abc\d{3}|[A-Z]{2}','MN')
print(result)
# <re.Match object; span=(0, 2), match='MN'>

05 检测类符号

  • 检测类符号的工作原理:先匹配(在匹配的时候,不用管检测类符号),在匹配成功后,再检测检测类符号所在的位置是否符合相关要求
1. \b - 检测\b所在的位置是否是单词边界

单词边界:空白符号、英文的标点符号、字符串开头和字符串结尾

result = fullmatch(r'm\b.n', 'm,n')
print(result)   # match='m,n' ,因为,是单词边界

result = findall(r'\b\d+\b', '881爱好728,数据m 8923就是,sjka829 80, 换手机90')
print(result)      # ['80']  前后都是空格,都是单词边界

2.^ - 检测是否是字符串开头,^必须放在正则表达式前面

3. $ - 检测是否是字符串结尾, $必须放在正则表达式后面

06 正则转义字符

  • 在本身有特殊意义或者特殊功能的**符号前加上 \ ** ,在正则中就变成普通符号。
result = fullmatch(r'\d\+\d', '2+3')
print(result)   #  match='2+3'

result = fullmatch(r'\(\d+\)', '(2234)')
print(result)  #  match='(2234)'   ( )括号前后都加了\
  • 在[ ] 外面独立存在有特殊意义的符号,在[ ] 里面会自动变成普通符号,例如:. + * ? $ 等
result = fullmatch(r'\d[.]\d', '2.3')
print(result)   # match='2.3'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值