day17正则表达式

本文详细介绍了Python中的正则表达式及其re模块的使用,包括fullmatch、findall、search等函数的功能和用法,以及正则中的特殊符号、分组、贪婪与非贪婪模式的概念和应用。此外,还展示了在实际场景中如何利用正则处理文本信息,如从网页中提取数据。
摘要由CSDN通过智能技术生成
正则表达式作用:

通过写正则表达式来描述字符串规则

re模块中的函数作用
fullmatch(正则表达式, 字符串)判断整个字符串是否满足正则表达式所描述的规则匹配失败结果都为None
findall(正则表达式, 字符串)提取字符串中所有满足正则表达式的字符串
search(正则表达式, 字符串)匹配字符串中第一个满足正则表达式的字符串
match(正则, 字符串)匹配字符串开头
finditer(正则, 字符串)获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象
splite(正则, 字符串, N)将字符串中前N个满足正则的子串作为切割点进行切割
sub(正则, 字符串1, 字符串2)将字符串2中所有满足正则的子串都替换成字符串1
注意:python中表达一个正则表达式一般使用r字符串

1.re模块 - 提供了python中所有和正则相关的函数

2.正则符号

正则符号作用
普通符号在正则表达式中表示符号本身
.表示匹配任意一个字符
\d匹配任意一个数字字符
\s匹配任意一个空白字符
\w匹配任意一个字母、数字、下划线或者中文
\D、\S、\W与小写的\d \s \w意义相反
[abc]匹配a或者b或者c
[abc\d]匹配a或者b或者c或者任意数字
[1-5]匹配1-5字符中的任意一个字符
[a-z]匹配任意一个小写字母
[A-Z]匹配任意一个大写字母
[a-zA-Z]匹配任意一个字母
[a-z=%]匹配任意一个小写字母或者=或者%
[\u4e00-\u9fa5]匹配任意一个中文
[^字符集]匹配不在字符集中的任意一个字符
\s补充:空白字符:空格(’ ‘)、换行(’\n’)、水平制表符(‘\t’)
# 普通字符
result = fullmatch(r'abc', 'xbc')
print(result)			# None

#  .	匹配任意一个字符
result = fullmatch(r'.bc', ',bc')
print(result)		# 返回正则对象

# \d
result = fullmatch(r'\d\dabc', '89abc')
print(result)

# \s
result = fullmatch(r'123\sabc', '123\tabc')
print(result)

正则匹配次数符号作用
*任意次数(0次或者1次或者次数)
+一次或者多次(至少1次)
?0次或者1次
{}{N}、{M,N}、{M,}、{,N}
{N}N次
{M,N}M到N次
{M,}最少M次
{,N}最多N次
# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。
# 合法:233、+234、-7283、100、-2000
# 不合法:0、0002、2.23

result = fullmatch(r'[+-]?[1-9]\d*', '0123')
print(result)
贪婪和非贪婪模式
# 在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个凑数,非贪婪取最少的那个次数
"""
贪婪模式:+ 、?、 *、{M,N}、{,N}、{M,}
非贪婪模式:+? 、??、 *?、{M,N}?、{,N}?、{M,}?
"""

分组和分支

1)分组 - ()

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

a.整体操作的时候需要分组

# '23M23'  '89K10L'  '09H23P90Q33W'
result = fullmatch(r'(\d\d[A-Z])+', '09H23P90Q33W')
print(result)

b.重复匹配	-	正则中可以通过\M来重复它前面第M个分组匹配的结果


# '23M23' '90K90'  '78N78'
result = fullmatch(r'(\d\d)[A-Z]\1', '78N78')
print(result)

c.捕获	-	提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容


# 匹配对象.group(N)	-	获取匹配结果中指定分组匹配到的内容
# 提取身高
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\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进行匹配

result = fullmatch(r'abc\d\d'|'abc[A-Z]{2}', 'abc123')
print(result)

result = fullmatch(r'abc(\d\d|[A-Z]{2})', 'abcKS')
print(result)
转义符号

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

# 去掉()原本的分组功能
# (amd)
result = fullmatch(r'\([a-z]{3}\)', '(amd)'
print(result)

result = fullmatch(r'\d\d\.\d\d', '23.45')
print(result)

# 两位数相加之和
result = fullmatch(r'\d\+\d', '3+4')
print(eval(result.group()))
            

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

例子:获取豆瓣top前250的电影名字
import requests
from re import findall

headers = {
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
}

response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)

# print(response.text)

result = findall(r'<img width="100" alt="(.+?)"', response.text)  # +?非贪婪模式

print(result)
练习: 使用正则提取top250中每个电影的详情页地址
from re import findall
import requests

headers ={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
}

resp = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)

result = findall(r' <a href=("https://movie.douban.com/subject/\d+/")>', resp.text)

print(result)
re模块
from re import fullmatch, findall, search, split, sub, finditer, match
"""
1)fullmatch(正则, 字符串)  -  用整个字符串和正则,匹配成功返回匹配对象,匹配失败返回None
2)findall(正则, 字符串)  -   获取字符串中所有满足正则的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
3)search(正则, 字符串)   -   匹配第一个满足正则的子串,匹配成功返回匹配对象,匹配失败返回None
4)split(正则, 字符串)    -   将字符串中所有满足正则的子串作为切割点进行切割
5)split(正则, 字符串, N)     -   将字符串中前N个满足正则的子串作为切割点进行切割
6)sub(正则, 字符串1, 字符串2)   -   将字符串2中所有满足正则的子串都替换成字符串1
7)sub(正则, 字符串1, 字符串2, N) 
8)finditer(正则, 字符串) -   获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是匹配对象
9)match(正则, 字符串)  -  匹配字符串开头
"""

1)忽略大小写 - (?i)
print(fullmatch(r'(?i)abc', 'abc'))
print(fullmatch(r'(?i)abc', 'Abc'))
print(fullmatch(r'(?i)abc', 'ABc'))
print(fullmatch(r'(?i)abc', 'aBc'))
2)单行匹配 - (?s)
# 多行匹配(默认):. 不能和换行符进行匹配
# 单行匹配:. 可以和换行符进行匹配
print(fullmatch(r'abc.123', 'abc\n123'))        # None
print(fullmatch(r'(?s)abc.123', 'abc\n123'))    # <re.Match object; span=(0, 7), match='abc\n123'>

msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall(r'(?s)name:"(.+)"', msg)
print(result)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值