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中使用MELIAE分析程序内存占用实例
Feb 18 Python
python批量制作雷达图的实现方法
Jul 26 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
Python unittest模块用法实例分析
May 25 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
Nov 14 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Python实现点云投影到平面显示
Jan 18 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python super()函数的基本使用
Sep 10 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
matlab xlabel位置的设置方式
May 21 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
PHP积分兑换接口实例
2015/02/09 PHP
php中return的用法实例分析
2015/02/28 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
php session_decode函数用法讲解
2019/05/26 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
利用百度echarts实现图表功能简单入门示例【附源码下载】
2019/06/10 Javascript
在Python中使用__slots__方法的详细教程
2015/04/28 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
详解Python中heapq模块的用法
2016/06/28 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
pandas数值计算与排序方法
2018/04/12 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
python学习开发mock接口
2019/04/28 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
平安建设汇报材料
2014/12/29 职场文书
单位介绍信格式
2015/01/31 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
关于车尾的标语大全
2015/08/11 职场文书
Nginx配置之禁止指定IP访问
2022/05/02 Servers
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android