python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解


Posted in Python onNovember 08, 2017

前言

在许多的情况下,很多要匹配内容是一起出现,或者一起不出现的。比如《》,< >,这样的括号,不存在使用半个的情况。因此,在正则表达式里也有一致性的判断,要么两个尖括号一起出现,要么一个也不要出现。怎么样来实现这种判断呢?针对这种情况得引入新的正则表达式的语法:(?=pattern),这个语法它会向前搜索或者向后搜索相关内容,如果不会出现就不能匹配。不过,这个匹配不会消耗任何输入的字符,它只是查看一下。

例子如下:

#python 3.6 
#蔡军生 
#http://blog.csdn.net/caimouse/article/details/51749579 
# 
import re 
 
address = re.compile( 
 ''''' 
 # A name is made up of letters, and may include "." 
 # for title abbreviations and middle initials. 
 ((?P<name> 
  ([\w.,]+\s+)*[\w.,]+ 
  ) 
  \s+ 
 ) # name is no longer optional 
 
 # LOOKAHEAD 
 # Email addresses are wrapped in angle brackets, but only 
 # if both are present or neither is. 
 (?= (<.*>$)  # remainder wrapped in angle brackets 
  | 
  ([^<].*[^>]$) # remainder *not* wrapped in angle brackets 
  ) 
 
 <? # optional opening angle bracket 
 
 # The address itself: username@domain.tld 
 (?P<email> 
  [\w\d.+-]+  # username 
  @ 
  ([\w\d.]+\.)+ # domain name prefix 
  (com|org|edu) # limit the allowed top-level domains 
 ) 
 
 >? # optional closing angle bracket 
 ''', 
 re.VERBOSE) 
 
candidates = [ 
 u'First Last <first.last@example.com>', 
 u'No Brackets first.last@example.com', 
 u'Open Bracket <first.last@example.com', 
 u'Close Bracket first.last@example.com>', 
] 
 
for candidate in candidates: 
 print('Candidate:', candidate) 
 match = address.search(candidate) 
 if match: 
  print(' Name :', match.groupdict()['name']) 
  print(' Email:', match.groupdict()['email']) 
 else: 
  print(' No match')

结果输出如下:

Candidate: First Last <first.last@example.com>
 Name : First Last
 Email: first.last@example.com
Candidate: No Brackets first.last@example.com
 Name : No Brackets
 Email: first.last@example.com
Candidate: Open Bracket <first.last@example.com
 No match
Candidate: Close Bracket first.last@example.com>
 No match

python里使用正则表达式的前向搜索否定模式

上面学习前向搜索或后向搜索模式(?=pattern),这个模式里看到有等于号=,它是表示一定相等,其实前向搜索模式里,还有不相等的判断。比如你需要识别EMAIL地址:noreply@example.com,这个EMAIL地址大多数是不需要回复的,所以我们要把这个EMAIL地址识别出来,并且丢掉它。怎么办呢?这时你就需要使用前向搜索否定模式,它的语法是这样:(?!pattern),这里的感叹号就是表示非,不需要的意思。比如遇到这样的字符串:noreply@example.com,它会判断noreply@是否相同,如果相同,就丢掉这个模式识别,不再匹配。

例子如下:

#python 3.6 
#蔡军生 
#http://blog.csdn.net/caimouse/article/details/51749579 
# 
import re 
 
address = re.compile( 
 ''''' 
 ^ 
 
 # An address: username@domain.tld 
 
 # Ignore noreply addresses 
 (?!noreply@.*$) 
 
 [\w\d.+-]+  # username 
 @ 
 ([\w\d.]+\.)+ # domain name prefix 
 (com|org|edu) # limit the allowed top-level domains 
 
 $ 
 ''', 
 re.VERBOSE) 
 
candidates = [ 
 u'first.last@example.com', 
 u'noreply@example.com', 
] 
 
for candidate in candidates: 
 print('Candidate:', candidate) 
 match = address.search(candidate) 
 if match: 
  print(' Match:', candidate[match.start():match.end()]) 
 else: 
  print(' No match')

结果输出如下:

Candidate: first.last@example.com
 Match: first.last@example.com
Candidate: noreply@example.com
 No match

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
人机交互程序 python实现人机对话
Nov 14 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
浅谈dataframe中更改列属性的方法
Jul 10 Python
python中import与from方法总结(推荐)
Mar 21 Python
python实现支付宝转账接口
May 07 Python
PyQt5图形界面播放音乐的实例
Jun 17 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Python操作Sonqube API获取检测结果并打印过程解析
Nov 27 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
基于python纯函数实现井字棋游戏
May 27 Python
Python requests及aiohttp速度对比代码实例
Jul 16 Python
Python入门之三角函数全解【收藏】
Nov 08 #Python
Python入门之三角函数tan()函数实例详解
Nov 08 #Python
Python入门之三角函数sin()函数实例详解
Nov 08 #Python
Python入门之三角函数atan2()函数详解
Nov 08 #Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 #Python
python的变量与赋值详细分析
Nov 08 #Python
浅谈python迭代器
Nov 08 #Python
You might like
Zerg基本策略
2020/03/14 星际争霸
PHP生成静态页面详解
2006/12/05 PHP
php mysql数据库操作分页类
2008/06/04 PHP
坏狼的PHP学习教程之第1天
2008/06/15 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
深入理解Node.js中的进程管理
2017/03/13 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
vue子传父关于.sync与$emit的实现
2019/11/05 Javascript
vue项目强制清除页面缓存的例子
2019/11/06 Javascript
vue实现登录功能
2020/12/31 Vue.js
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python+OpenCV图片局部区域像素值处理详解
2019/01/23 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
Python如何实现强制数据类型转换
2019/11/22 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python 内存管理机制全面分析
2021/01/16 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
热能动力工程毕业生自荐信
2013/11/07 职场文书
骨干教师考核方案
2014/05/09 职场文书
技术经济专业求职信
2014/09/03 职场文书