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模拟登录12306的方法
Dec 30 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
Python检测网络延迟的代码
May 15 Python
创建pycharm的自定义python模板方法
May 23 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
Django后台admin的使用详解
Jul 08 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
pandas数据处理之绘图的实现
Jun 15 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
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
获取URL文件名后缀
2013/10/24 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
简单的自定义php模板引擎
2016/08/26 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
详解python运行三种方式
2019/05/13 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Django如何在不停机的情况下创建索引
2020/08/02 Python
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
网络书店创业计划书
2014/02/07 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
计生专干事迹
2014/05/28 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
爱国主题班会教案
2015/08/14 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS