day14-正则表达式

day14-正则表达式

1.匹配类符号
1.1什么是正则表达式

一种可以把复杂的字符串问题变成简单的工具

# 先导入函数
from re import fullmatch, match
2.fullmatch函数
  • fullmatch(正则表达式,字符串) - 判断字符串是否满足正则表达式描述的规则(如果不满足结果就是None)。
  • 不管使用正则表达式解决什么样的字符串问题,写正则都是在描述字符串规则。
3.所有匹配类符号
1.普通符号

在正则表达式中表示本身的字符就是普通符号

result = fullmatch(r'abc', 'abc')   # 表达式和字符串不一样时结果为None
print(result)	# <re.Match object; span=(0, 3), match='abc'>
2. .

匹配任意一个字符

result = fullmatch(r'.abc', 'qabc')
print(result)	# <re.Match object; span=(0, 4), match='qddc'>
3.\d

匹配任意一个数字字符

result = fullmatch(r'a\d\dd', 'a43d')
print(result)	# <re.Match object; span=(0, 4), match='a43d'>
4.\s

匹配任意一个空白字符

空白字符 - 所有能产生空白效果的字符:空格、\t、\n

result = fullmatch('a\sb', 'a b')
print(result)	# <re.Match object; span=(0, 3), match='a b'>
5.\w

匹配任意一个数字、字母、下划线或者中文

print(fullmatch(r'a\wb\, 'a是b'))  # <re.Match object; span=(0, 3), match='a是b'>
                
6.\D、\S、\W
  • \后面跟大写字母对应的功能和\后面跟小写字母的功能相反

\D - 匹配任意一个非数字

\S - 非空格

\W - 非数字、中文、字母、下划线

print(fullmatch(r'a\Db\Sc\We', 'albkc-e'))	# <re.Match object; span=(0, 7), match='albkc-e'>
7.[字符集]
  • 匹配在字符集中任意一个字符

[amx] - 匹配a、m、x中的任意一个

[\dmn] - (\开头的特殊符号在中括号中还是有特殊意义)匹配任意一个数字或者m或者n

[3-9mn] - (-在中括号中表示谁到谁)匹配3到9中的任意一个数字或者m、n

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

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

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

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

  • 注意:中括号中的减号只有放在两个字符之间才能表示谁到谁,如果放在中括号的最前面或者最后面,或者放在中括号外边,只表示减号本身
print(fullmatch(r'a[ayz]b', 'ayb')) # <re.Match object; span=(0, 3), match='ayb'>

print(fullmatch(r'a[-a]b','a-b'))	# <re.Match object; span=(0, 3), match='a-b'>

print(fullmatch(r'a[ab\d]c','a0c'))	# <re.Match object; span=(0, 3), match='a0c'>

print(fullmatch(r'a[\u4e00-\u9fa5A-Z]b','a是b'))	# 中括号中是中文或者大写字母
# <re.Match object; span=(0, 3), match='a是b'>
8.[ ^字符集]

匹配不在字符集中的任意一个字符

  • 注意:[]里面的,只有放在最前面才有特殊功能,如果不在最前面就是普通符号
print(fullmatch(r'a[^A-Z]b', 'a2b'))	# <re.Match object; span=(0, 3), match='a2b'>
2.匹配数相关符号
1.*

0次或者多次(任意多次)

  • 匹配类符号(*号前面加)
print(fullmatch(r'a*b', 'b'))	# 0次
print(fullmatch(r'.*b', 'efnj23b'))
print(fullmatch(r'[A-Z]*b', 'ASDJNb'))
2.+

一次或多次

print(fullmatch(f'a+b', 'aaab'))
3.?

0次或者1次

print(fullmatch(r'a?b', 'ab'))	# 1次
print(fullmatch(r'a?b', 'b'))	# 0次
4.{}

{N} - N次

{M,N} - M到N次

{M,} - 至少M次

{,N} - 最多N次

print(fullmatch(r'a{3}b', 'aaab'))
print(fullmatch(r'a{3,5}b', 'aaaab'))	# a重复3到5次
print(fullmatch(r'a{3,}b', 'aaaaab'))	# a最少重复3次
print(fullmatch(r'a{,4}b', 'aab'))	# a最多重复4次
5.贪婪和非贪婪

匹配次数不确定的时候匹配模式分为贪婪和非贪婪两种,默认是贪婪的。

  • 贪婪:在能匹配成功的情况下,有多种匹配次数,贪婪取次数最多的那个次数。(+、*、?、{M,N}、{M,}、{,N})
  • 非贪婪:在能匹配成功的情况下有多种匹配次数,非贪婪取次数最少的那个次数.(+?、*?、??、{M,N}?、{M,}?、{,N}?)

fullmatch(正则表达式,字符串) - 匹配整个字符串

match(正则表达式,字符串) - 匹配字符串开头,表达式后面可以加字符串,但后面的字符无法打印

print(match(r'a\d', 'a3d试试')) # <re.Match object; span=(0, 2), match='a3'>

# 贪婪
print(match(r'a.+b','a1b就是b桑b时间'))  # <re.Match object; span=(0, 8), match='a1b就是b桑b'>

# 非贪婪
print(match(r'a.+?b', 'a1b就是b桑b时间')) # <re.Match object; span=(0, 3), match='a1b'>

练习:写正则表达式可一匹配任意一个整数字符串

print(fullmatch(r'[+-]?[1-9]\d*','311'))
3.匹配数相关符号
1.() - 分组
  • 在正则表达式中可一用()将正则表达式中的部分内容括起来表示一个整体,一个()代表一个分组

  • 以某个部分为单位对符号进行控制

1.整体控制 - 以某个部分为单位对符号进行控制
# 'mn234jd234jd534su844'
print(fullmatch(r'([a-z]{2}\d{3})+', 'as134gd432ds234yt765'))
2.重复 - 在正则中可以通过\N来重复它前面第N个分组匹配到的结果
# '234-234'、'001-001'
print(fullmatch(r'(\d{3})-\1', '234-234'))
print(fullmatch(r'([a-z]{2})(\d{3})=\2\1{2}\2', 'mn897=897mnmn897'))
3.捕获 - 获取匹配结果的某个部分
  • 捕获分为自动捕获和手动捕获两种,只有findall具有自动捕获的功能,其他都需要手动捕获
  • filldall(正则表达式,字符串) - 获取字符串中所有满足正则的字串
message = '年龄: 18岁, 身高: 170, 体重: 120斤, 月薪: 3000元, 房租: 1000元'
result = findall(r'\d+', message)
print(result)	# ['18', '170', '120', '3000', '1000']

print(findall(r'\d元',message))	# ['3000元', '1000元']

# 自动捕获  -   自动获取匹配结果分组匹配到的内容
print(findall(r'(\d+)元', message))	# ['3000', '1000']

# 手动捕获  -   写额外的代码来获取匹配结果中分组匹配到的内容
result = fullmatch(r'(\d+)元', '8292元')
# 获取匹配结果:匹配对象.group()
print(result.group())	# 8292元
print(result.group(1))	# 8292


result = fullmatch(r'(\d{2})([a-z]{3})', '23ksk')
print(result.group())	# 23ksk
print(result.group(1))	# 23
print(result.group(2))	# ksk
2.| - 分支

正则1|正则2 - 先看正则1去匹配,如果匹配成功,整个正则表达式匹配成功,如果匹配失败就用正则2来匹配。

# '23mns'、 '54看手机'
print(fullmatch(r'\d{2}[a-z]{3}|d{2}[\u4e00-\u9fa5]{3}', '23bid'))
print(fullmatch(r'\d{2}([a-z]{3}|[\u4e00-\u9fa5])', '42看手机'))
4.检测类符号

在匹配成功的情况下检测指定的位置是否符合要求(不影响字符串长度)

1.\b - 检测\b所在的位置是否是单词边界

单词边界:英文符号中可以区分出不同单词的符号(例如:空白符号、英文标点符号、字符串开头、字符串结尾)

print(fullmatch(r'\d{2}, \ba','23.a'))	# <re.Match object; span=(0, 4), match='23,a'>

str1 = '231isj345含手机 789,89ksk908 数 899'
print(findall(r'\d+', str1))	# ['231', '345', '789', '89', '908', '899']
print(findall(r'\b\d+',str1))	# ['231', '789', '89', '899']
print(findall(r'\d+\b', str1))	# ['789', '908', '899']
print(findall(r'\b\d+\b', str1))	# ['789', '899']
2.^ - 用在中括号外边时,检测是否是字符串开头(一般放在最前面)
3.& - 检测是否是字符串结尾(一般放在最后面)

search(正则,字符串) - 获取字符串中第一个满足条件的字串

print(search(r'\d{3}', 'shih322kcjus433id'))	# <re.Match object; span=(4, 7), match='322'>

print(search(r'^1[3-9]\d{9}', '14587667555dgs'))	# <re.Match object; span=(0, 11), match='14587667555'>
4.转义字符 - 在正则中有特殊意义的符号前加\,让这个符号变成普通符号
  • ‘合.234’、‘块.82902’
print(fullmatch(r'[\u4e00-\u9fa5]\.\d+','和.234'))   # <re.Match object; span=(0, 5), match='和.234'>
  • ‘2*8’
print(fullmatch(r'\d\*\d', '2*8'))
  • ‘(MHS)’
print(fullmatch(r'\([A-Z]{3}\)', '(MHS)'))  # <re.Match object; span=(0, 5), match='(MHS)'>
5.re模块 - 模块中全是和正则表达式相关的函数

导入模块中的函数

from re import fullmatch, match, search, findall, finditer, sub, split
  • fullmatch(正则,字符串) - 匹配正字符串(判断这个字符串是否符合正则描述的规则),匹配成功返回匹配对象,匹配失败返回None

  • match(正则,字符串) - 匹配正字符串开头(判断字符串开头是否符合正则描述的规则),匹配

    成功返回匹配对象,匹配失败返回None

  • search(正则,字符串) - 匹配字符串中第一个满足正则的字符串,匹配成功返回匹配对象,匹配失败返回None

  • findall(正则,字符串) - 获取字符串中所有满足正则的字串,返回值是一个列表,列表中的元素是匹配到字符串

  • finditer(正则,字符串) - 获取字符串中所有满足正则的字串,返回值是一个迭代器,迭代器中的元素是匹配对象

  • sub(正则,字符串) - 将字符串中所有满足正则的字串作为切割点对字符串进行切割

  • split(正则,字符串1,字符串2) - 将字符串2中所有满足正则的字串都替换成字符串1

str1 = '换书记2443就是24,hd43 78m加上 89'
print(findall(r'\d+, str1))	 	# ['2443', '24', '43', '78', '89']

result = finditer(r'\d', str1)
print(result)			# <callable_iterator object at 0x000001F00C788FD0>
print(next(result))		# <re.Match object; span=(3, 7), match='2443'>
print(list(result))		# [<re.Match object; span=(9, 11), match='24'>, <re.Match object; span=(14, 16), match='43'>, <re.Match object; span=(17, 19), match='78'>, <re.Match object; span=(23, 25), match='89'>]
              
print(split(r'\d+', str1))	# ['换书记', '就是', ',hd', ' ', 'm加上 ', '']
       
print(sub(r'\d+', 'A', str1))	# 换书记A就是A,hdA Am加上 A
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值