python正则表达式:贪婪与非贪婪

贪婪与非贪婪

python里的数量词默认是贪婪的,总是尝试尽可能的匹配更多的字符。python中使用?号关闭贪婪模式

import re
print(re.match(r"aa\d+","aa2323"))   #会尽可能多的去匹配\d
# <re.Match object; span=(0, 6), match='aa2323'>
print(re.match(r"aa\d+?","aa2323"))  #尽可能少的去匹配\d
# <re.Match object; span=(0, 3), match='aa2'>
import re
s = "this is a number 234-235-22-423"
# 1.贪婪模式
resule = re.match(r"(.+)(\d+-\d+-\d+-\d)",s)   #我们本想数字和字母拆解成两个分组
#('this is a number 23', '4-235-22-4')
#d+后面的是分隔符 后面是RP测试
resule2 = re.match(r"(.+)(\d+\d+\d+-\d)",s)
#('this is a number 234-', '235-2')
print(resule.groups())  #('this is a number 23', '4-235-22-4')但我们发现输出的结果中23的数字竟然被弄到前面去了
print(resule2.groups())
#因为+它会尽可能多的进行匹配,\d,只需要一个4就能满足,所以前面就尽可能多的匹配
# 2.关闭贪婪模式
#在数量词后面加上 ?,进入非贪婪模式,尽可能少的进行匹配
result = re.match(r"(.+?)(\d+-\d+-\d+-\d)",s)
print(result.groups())   #('this is a number ', '234-235-22-4')
# ('this is a number ', '234-235-22-4')
RP = "this is a number234-235-22-423"
# RP测试空格
resule3 = re.match(r"(.+)(\d+-\d+-\d+-\d)",RP)
print(resule3.groups())
#('this is a number23', '4-235-22-4') 
RP = "this is a number234-235-22-423"
# RP测试
resule4 = re.match(r"(.+?)(\d+-\d+-\d+-\d)",RP)
print(resule4.groups())
#('this is a number', '234-235-22-4')

案例

匹配手机号

要求,手机号为11位,必须以1开头,且第二个数字为35678其种一个

import re
result = re.match(r'1[35678]\d{9}','13111111111')
print(result.group())   #匹配成功
# 13111111111
result2 = re.match(r'1[35678]\d{8}','13111111111')#RP测试
print(result2.group())   #匹配成功
# 1311111111
result = re.match(r'1[35678]\d{9}','15111111111')
print(result)     #none,第二位为2
# None
result = re.match(r'1[35678]\d{9}','121111111112')
print(result)     #none,有12位
# None

提取网页源码中所有的文字

如下,将其中的所有文字提取出来,去掉标签。思路就是运用sub方法,将标签替换为空

import re
s = """<div>
<p>阿P的哲学:</p>
<p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
<p><br></p>
<P>必备要求:</p>
<p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求:</p>
<p>1、一年以上 Python开发经验,掌握面向对象分析和设计,了解设计模式</p>

</div>"""
result = re.sub(r'<.*?>|&nbsp','',s)  #
#sub(要替换的数据,替换成什么,要替换的数据所在的数据)#RP:这样写通俗易懂啊
print(result)
# 阿P的哲学:
# 完成推荐算法、数据统计、接口、后台等服务器端相关工作
# 
# 必备要求:
# 良好的自我驱动力和职业素养,工作积极主动、结果导向
# ;
# 技术要求:
# 1、一年以上 Python开发经验,掌握面向对象分析和设计,了解设计模式
result2 = re.sub(r'<.*?>','',s)
print(result2)
# 阿P的哲学:
# 完成推荐算法、数据统计、接口、后台等服务器端相关工作
# 
# 必备要求:
# 良好的自我驱动力和职业素养,工作积极主动、结果导向
# &nbsp; ##RP 这是空格
# 技术要求:
# 1、一年以上 Python开发经验,掌握面向对象分析和设计,了解设计模式
result3 = re.sub(r'&nbsp','',s)
print(result3)
# <div>
# <p>阿P的哲学:</p>
# <p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
# <p><br></p>
# <P>必备要求:</p>
# <p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p>
# <p>;<br></p>
# <p>技术要求:</p>
# <p>1、一年以上 Python开发经验,掌握面向对象分析和设计,了解设计模式</p>
# ##RP 没空格了
# </div>

 要提取出来最重要的就是关闭贪婪模式,

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值