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调用shell的方法
Nov 20 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
Python实现八大排序算法
Aug 13 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
python实现自动解数独小程序
Jan 21 Python
从0开始的Python学习016异常
Apr 08 Python
详解Python中的分支和循环结构
Feb 11 Python
python标准库OS模块函数列表与实例全解
Mar 10 Python
django上传文件的三种方式
Apr 29 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 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面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
thinkPHP框架中layer.js的封装与使用方法示例
2019/01/18 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
jQuery选择头像并实时显示的代码
2010/06/27 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
Node调用Java的示例代码
2017/09/20 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
python中base64加密解密方法实例分析
2015/05/16 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
详解CSS3 filter:drop-shadow滤镜与box-shadow区别与应用
2020/08/24 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
幼师求职自荐信
2014/05/31 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
怎样写观后感
2015/06/19 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
python基础之匿名函数详解
2021/04/21 Python
Java 数据结构七大排序使用分析
2022/04/02 Java/Android