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使用MySQLdb for Python操作数据库教程
Oct 11 Python
python实现计算倒数的方法
Jul 11 Python
初步剖析C语言编程中的结构体
Jan 16 Python
详解python进行mp3格式判断
Dec 23 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
Django基础知识 URL路由系统详解
Jul 18 Python
由面试题加深对Django的认识理解
Jul 19 Python
django用户登录验证的完整示例代码
Jul 21 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
python logging设置level失败的解决方法
Feb 19 Python
python能做哪方面的工作
Jun 15 Python
Python PIL按比例裁剪图片
May 11 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 Static关键字实用方法
2010/06/04 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
基于jquery实现多选下拉列表
2017/08/02 jQuery
解决vue+webpack打包路径的问题
2018/03/06 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
express框架下使用session的方法
2019/07/31 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
Python线程中对join方法的运用的教程
2015/04/09 Python
Python的pycurl包用法简介
2015/11/13 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python Selenium 之关闭窗口close与quit的方法
2019/02/13 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
wxpython布局的实现方法
2019/11/01 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
护士实习鉴定范文
2013/12/22 职场文书
委托书格式要求
2015/01/28 职场文书
原告离婚代理词
2015/05/23 职场文书
教师病假条范文
2015/08/17 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL