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编程中运用闭包时所需要注意的一些地方
May 02 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
python实现维吉尼亚算法
Mar 20 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
python sitk.show()与imageJ结合使用常见的问题
Apr 20 Python
python温度转换华氏温度实现代码
Dec 06 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 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
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
javascript demo 基本技巧
2009/12/18 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
js jquery数组介绍
2012/07/15 Javascript
Jquery获取和修改img的src值的方法
2014/02/17 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python脚本替换指定行实现步骤
2017/07/11 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
video.js支持m3u8格式直播的实现示例
2020/05/20 HTML / CSS
大学生的自我鉴定范文
2014/01/21 职场文书
会计专业大学生求职信范文
2014/01/28 职场文书
护士自我鉴定总结
2014/03/24 职场文书
学前班评语大全
2014/05/04 职场文书
安全承诺书格式
2014/05/21 职场文书
感谢信格式范文
2015/01/22 职场文书
公司捐书倡议书
2015/04/27 职场文书
美丽人生观后感
2015/06/03 职场文书
郭明义观后感
2015/06/08 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
Elasticsearch 数据类型及管理
2022/04/19 Python
vue组件vue-esign实现电子签名
2022/04/21 Vue.js