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实现的一个自动售饮料程序代码分享
Aug 25 Python
Python将xml和xsl转换为html的方法
Mar 10 Python
python实现猜单词小游戏
May 22 Python
2019 Python最新面试题及答案16道题
Apr 11 Python
图文详解python安装Scrapy框架步骤
May 20 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
如何实现Django Rest framework版本控制
Jul 25 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python实现指定ip端口扫描方式
Dec 17 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
Alpine安装Python3依赖出现的问题及解决方法
Dec 25 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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
文章推荐系统(二)
2006/10/09 PHP
php常用文件操作函数汇总
2014/11/22 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python远程连接服务器MySQL数据库
2018/07/02 Python
Python第三方库h5py_读取mat文件并显示值的方法
2019/02/08 Python
Python 复平面绘图实例
2019/11/21 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
OpenCV+python实现膨胀和腐蚀的示例
2020/12/21 Python
python3 kubernetes api的使用示例
2021/01/12 Python
一个精品风格的世界:Atterley
2019/05/01 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
名人演讲稿范文
2013/12/28 职场文书
四风存在的原因分析
2014/02/11 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
个人贷款收入证明
2014/10/26 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL