正则表达式

正则表达式是独有的工具:用来匹配或者提取字符串

不属于Python基础

属于编程基础。

注意开头要导入

import re

1、findall方法:

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表 ,如果没有找到匹配的,则返回空列表

2、match方法

re.match 尝试从字符串的起始位置匹配一个模式,匹配成功 返回的是一个匹配 对象(这个对象包含了我们匹配的信息),如果不是起始位置匹配成功的话, match()返回的是空,

注意:match只能匹配到一个

a = "python123123java"
print(re.match('python',a))
print(re.match('python',a).group())# 查看匹配的字符
print(re.match('123',a))
print(re.match('python',a).span())# 匹配字符的下标取值区间

3、search方法

re.search 扫描整个字符串,匹配成功 返回的是一个匹配对象(这个对象包含了我们匹配的信息)

注意:search也只能匹配到一个,找到符合规则的就返回,不会一直往后找

print(re.search('123',a))# yes
print(re.search('cc',a))# None
print(re.search('python',a).group())
print(re.search('python',a).span())

re.match与re.search的区别: re.match只匹配字符串的开始位置找,如果字符串开始不符合正则表达式,则匹配失败, re.search:匹配整个字符串,如果一直找不到则,返回是空的,没有结果

4、元字符

单字符匹配

字符描述
.匹配任意1个字符(除了\n)
[ ]匹配 [ ] 中列举的字符
\d匹配数字,即0-9
\D匹配非数字,即不是数字
\s匹配空白,即 空格,tab键
\S匹配非空白
\w匹配单词符,即a-z、A-Z、0-9
\W匹配非单词字符

注意使用时转义(转义就是在前面加r)

例子在下一个代码段

代表数量的元字符

字符描述
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现1次或者无限次,即至少有1次
匹配前一个字符出现0次或者1次,即要么有1次,要么没有
{x}匹配前一个字符出现x次
{x,}匹配前一个字符至少出现x次
{x,y}匹配前一个字符出现从m到n次
b = '张三天在玩4399小游戏,张三 hello 玩的.很开心'
ress = re.findall(r'张三.',b)# .任意一个字符
ress1 = re.findall(r'[54]',b)
ress1 = re.findall(r'\d',b)# 匹配数字,单个字符,单个元素
ress1 = re.findall(r'\D',b)#
ress1 = re.findall(r'4*',b)# 匹配前一个字符出现0次或者无限次,即可有可无
ress1 = re.findall(r'4+',b)# 匹配前一个字符出现1次或者无限次,即可有可无
ress1 = re.findall(r'三{2}',b)# 匹配前一个字符出现m次
ress1 = re.findall(r'三{1,}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'三{1,2}',b)# 匹配前一个字符出现从m到n次
ress1 = re.findall(r'^张三',b)# 匹配字符串开头
ress1 = re.findall(r'心$',b)# 匹配字符串结尾
ress1 = re.findall(r'\bhello\b',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
ress1 = re.findall(r'he\Bll',b)# 匹配一个单词的边界
print(ress1)
字符描述
|可以理解或者
()将括号中的字符作为一个分组

a = "a+bhelloa-bhello"
b = re.findall(r"a\+b|a-b",a)
print(b)
#打印出来会是   a+b a-b

5、贪婪和非贪婪

正则默认都是用贪婪模式去匹配数据的,就是尽可能多的匹配符合要求的数据,

在非贪婪模式下,始终找最短匹配

在爬虫中会使用

a = '<a>啦啦</a><a>好</a><a>不好</a><a>嗯</a>'

print(re.findall(r'<a>(.*)</a>',a))# 贪婪
#这样打印出来的结果会是     啦啦</a><a>好</a><a>不好</a><a>嗯
#相当于去头和尾

print(re.findall(r'<a>(.*?)</a>',b))# 加上?变成非贪婪
#这样打印出来的结果会是      啦啦 好 不好 嗯
#只取括号里面的文字


#这个括号的意思的可以理解为   只取括号里面的内容左右不保存

这里的?和元字符的不一样

这个问号可以这样理解:

有人给你选择100 10 1

贪婪会选择100甚至更多,在你给我的选项里我选择最多的那个

相反非贪婪就是选择最少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

虎梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值