正则表达式四位数字_P18 10分钟玩转正则表达式贪婪、向后引用、零款断言


title: P18|Python正则表达式中的贪婪、向后引用、零宽断言
author: Adolph Lee
categories: 编程基础
tags:

  • Python
  • 基础
  • 正则表达式
  • 断言

在计算机编程中,正则表达式堪称我们处理字符串的神奇,许多复杂的工作,往往使用正则表达式就能简单的搞定。在之前我们已经涉及到了正则表达式的部分内容,下面我们来讲解一下有关正则表达式的贪婪模式,向后引用与零款断言。

0fac045e2dc469443485a3872d8e6ade.png

贪婪模式

当正则表达式中包含能接受重复的界定符时,正则表达式会在能够匹配的情况下尽可能多的匹配字符。这种匹配模式我们称之为贪婪模式,但有时候我们需要程序不这么贪婪,还是更加懒惰一些,也就是需要程序尽可能少的匹配符合条件的字符串,贪婪模式与懒惰模式的切换只需要在原表达式后方加上一个问号。
实例一:’a.b’,这个表达式将会匹配以a开头以b结尾的所有字符串,例如’abbbabbbab’,匹配的结果将是整个字符串,如果使用懒惰模式将正则表达式修改为’a.?b’,将只会匹配’ab’。

import restring = 'abbbabbbacdb'# 贪婪模式print(re.findall('a.*b',string))# 懒惰模式print(re.findall('a.*?b',string))
044e8c7bf4f22239ea395456d9d300d1.png

实例二:匹配字符串中的所有url

import reurl = 'www.baidu.com//http://www.qq.comwww.taobao.com'#使用贪婪模式匹配其中的网址url_list = re.findall('www.*com',url)print(url_list)#使用懒惰模式匹配其中的网址url_list = re.findall('www.*?com',url)print(url_list)
21ed79013309224beee8ee1a0c84a061.png

分组

在讲解向后引用之前,我们先讲解一下分组,分组就是用一对圆括号()包裹起来的正则表达式内容,从正则表达式的左边开始每一个圆括号就是一个分组,分组的索引是从一开始的。

  •   分组分为有命名分组和无命名分组
  •   使用search分组完成后,可以通过group或者groups获取分组中的内容
  •   在正则表达式前加上?P为分组命名
import re# 无命名分组string = 'c2c'print(re.search('c(d)c',string).groups())print(re.search('c(d)c',string).group(1))# 有命名分组string = 'ip = 192.168.1.1,port = 3306'print(re.search('(?P(d{1,3}.){3}d{1,3})',string).group('ip'))
5f082f4d3e33c3c43fbb8a152cba1ded.png

向后引用

正则表达式中我们可以对整个分组进行一些正则操作,例如重复操作符。

  •   um 正则表达式中利用反斜杠加分组索引引用无命名分组
  •   (?P=name) 正则表达式用利用(?P=name)引用命名分组
# 引用有命名分组import restring = '找到字符串中的重复字英文符hello hello hello'print(re.search(r'(?P(?Phello)s(?P=repeat)s(?P=repeat))',string).group('result'))# 引用无命名分组string = '找到字符串中的重复字英文符hello hello hello'print(re.search(r'(?P(hello)s2s2)',string).group('result'))
43c21ff9381bafad7ac7ce7c5b9a55eb.png

零宽断言

零宽断言是正则表达式的一种方法,用于查找在某些内容(但并不含这些内容)之前或之后的东西,也就是说它们是用于指定位置,这个位置应该满足一定的条件(断言),因此这些条件也常被称之为零宽断言。零宽断言可以分为前向肯定断言、前向否定断言、后向肯定断言、后向否定断言。

  •   前向肯定断言⇒(?=)
  •   前向否定断言⇒(?!)
  •   后向肯定断言⇒(?<=)
  •   后向否定断言⇒(?

前向肯定断言 (?=)

它断言自身出现的位置的后面能匹配表达式,例如匹配所有以ing结尾的单词,并只返回前面部分

import restring = 'When I was young and free and my imagination had no limits, I dreamed of changing the world'print(re.findall(r'b[a-zA-Z]*(?=ing)',string))
6f66973a5acf269b5d758a4bffe28282.png

前向否定断言 (?!)

它断言自身出现位置的后面不能包含指定表达式,例如匹配一个字符串中的四位数字,且这四位数字的后面不能是数字

import restring = '13888888888 13777778889 18888888888 18686868886 'print(re.findall('d{4}(?!d)',string))
498c748539ddecc14b7565f2989884aa.png

后向肯定断言 (?<=)

它断言自身出现位置的前面能够匹配表达式,例如匹配所有以a开头的单词,并只返回单词除a以外的部分

import restring = 'When I was young and free and my imagination had no limits, I dreamed of changing the world'print(re.findall(r'(?<=ba)[a-zA-Z]*b',string))
d8cbee72b2ec9c6e3ed24f7047fb0111.png

后向否定断言 (?

它断言自身出现位置的前面不能包含指定表达式,例如匹配所有不以字母开头的数据

import restring = 'a13888888888 b13777778889 c18888888888 18686868886'print(re.findall(r'b(?
2881d11d6d3f67135e252339f3898ac3.png

练习一

找出字符串中所有重复出现的单词

import restring = 'When I was young and free and my imagination had no limits, I dreamed of changing the world'print(re.findall(r'(?=(b[a-zA-Z]+b).+1)',string))
be3fb4942413d797dedfff46c1aa308d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值