python正则表达式

正则表达式

1.正则的作用:

正则表达式是一种可以让复杂的字符串变得简单得工具

写正则表达式就是用正则符号来描述字符串规则

案例:判断一个字符串是否是一个合法得手机号码

from re import *
result = re.fullmatch(r'1[3-9]\d{9}',tel)
if result:
    print('合法')
else:
    print('不合法')

from re import fullmatch,findall ,search,split,sub,finditer,mach

2.正则语法
  1. re模块 —— 提供了python中所有和正则相关得函数

(1)fullmatch(正则表达式,字符串) —— 判断整个字符串是否满足正则表达式所描述的规则,匹配 成功返回匹配对象,失败返回None

(2)findall(正则表达式,字符串) ——提取字符串中所有满足正则表达式的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)

(3) search(正则表达式,字符串) ——匹配字符串中第一个满足正则表达式的子串,匹配成功返回匹配对象,失败返回None

(4)spit(正则,字符串) —— 将字符串中所有满足正则的字串做为切割点进行切割

​ spit(正则,字符串,N) —— 将字符串中前N个满足正则的字串做为切割点进行切割

(5)sub(正则,字符串1,字符串2) ——将字符串2中所有满足正则的字串都替换成字符串1

​ sub(正则,字符串1,字符串2,N) ——将字符串2中前N个满足正则的字串都替换成字符串1

(6)finditer(正则,字符串 ) —— 获取字符串中满足正则的所有字串,返回

(7)match(正则, 字符串) - 匹配字符串开头

注意:python中表达式一个正则表达式一般使用r字符串

  1. 忽略大小写:(?i)

  2. 单行匹配:(?s) : . 可以和换行符进行匹配

  3. 多行匹配(默认): . 不能和换行符进行匹配

  4. 正则符号:

(1)普通符号 —— 在正则表达式中表示符号本身的符号

result = fullmatch(r'abc','dbc')
print(sesult)   ##None

(2). ——匹配任意一个字符

result = fullmatch(r'.bc','dbc')
print(result)
#<re.Match object; span=(0, 3), match='dbc'>

(3)\d —— 匹配任意一个数字字符

result = fullmatch(r'\dbc','6bc')
print(result)
#<re.Match object; span=(0, 3), match='6bc'>

(4)\s —— 匹配任意一个空白字符

空白字符:空格(‘ ’)、换行(‘\n’)、水平制表符(‘\t’)

(5)\w —— 匹配任意一个字母、数字、下划线或者中文

result = fullmatch(r'abc\w123','abc_123')
print(result)
#<re.Match object; span=(0, 7), match='abc_123'>

(6)\D、\S、\W —— 分别和\d、\s、\w的功能相反

result = fullmatch(r'abc\D123','abc1123')
print(result)
#None

(7)[字符集] —— 匹配在字符集中的任意一个字符

[abc] :匹配a或b或c

[abc\d] :匹配a或b或c或任意数字

[1-5] : 匹配字符1到字符5中的任意一个字符

[a-z] :匹配任意一个小写字母

[A-Z] :匹配任意一个大写字母

[a-zA-Z] : 匹配任意一个字母

[\u4e00-\u9fa5] :匹配任意一个中文

result = fullmatch(r'abc[M9你]123','abc9123')
print(result)
##<re.Match object; span=(0, 7), match='abc9123'>

result = fullmatch(r'abc[M9你]123','abcx123')
print(result)
#None

(8)[ ^字符集] —— 匹配不在字符集中的任意一个字符

  1. 匹配次数符号:

匹配类符号匹次数

(1) * —— 任意次数(0次或者1次或者任意次数)

注意: *放在谁的后面谁出现任意多次

a*    ——  a出现任意多次
\d    ——  任意多个任意数字

(2)+ —— 一次或者多次(至少一次)

(3)? —— 0次或者1次(至多1次)

(4){}

  • {N} ----- N次
  • {M,N} —— M到N次
  • {M,} —— 至少M次
  • {,N} —— 最多N次
# 写一个正则表达式 ,可以匹配任意一个除了0的整数
result = fullmatch(r'[-+]?[1-9]\d*','520')
print(result)

(5)贪婪和非贪婪模式

在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的哪个次数

贪婪模式 :+、?、*、{M,N}、{M,}、{,N}

非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?

result = search(r'a.+b','哒哒哒fjafjfkbkfbkkfb')
print(result)
#<re.Match object; span=(5, 18), match='afjfkbkfbkkfb'>
result = search(r'a.+?b','哒哒哒fjafjfkbkfbkkfb')
print(result)
#<re.Match object; span=(5, 11), match='afjfkb'>
4.分组和分支
1.分组

正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组

(1)整体操作的时候需要分组:

result = fullmatch(r'(\d\d[A-Z])+','09D15D65W36W')
print(result)  #两个数字一个字母重复出现

(2)重复匹配 —— 正则中可以通过\M来重复他前面第M个分组匹配的结果

result = fullmatch(r'(\d\d)[A-Z]\1','90K90')
print(result)

(3)捕获 —— 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)

findall在正则表达式中有分组的时候,会自动提取正则表达式中分组匹配到的内容

message = '技术上234,jsskf8992==技术njk==9223-ssjs123结束时间789'
result = findall(r'[\u4e00-\u9fa5](\d+)',message)
print(result)
#['234', '789']  ,找出文字后面是数字字符的所有数字

手动捕获:匹配对象.group(N) ——获取匹配结果中指定分组匹配到的内容

message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d\d\d)厘米,体重(\d\d)kg',message)
print(result)    #<re.Match object; span=(11, 25), match='身高180厘米,体重70kg'>
print(result.group())   #身高180厘米,体重70kg
print(result.group(1),result.group(2))   #180 70
2.分支

正则1|正则2|正则3… —— 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,…


5.转义符号

在本身具有特殊功能或者特殊意义的符号前加\,让特殊符号变成普通

result = fullmatch(r'\d+\d','23')
print(result)
#<re.Match object; span=(0, 2), match='23'>

result = fullmatch(r'\d\+\d','2+3')
print(result)
#<re.Match object; span=(0, 3), match='2+3'>

注意:单独存在有特殊意义的符号,在[]中他的功能也会自动消失

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值