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爬虫中urllib库的进阶学习
Jan 05 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
python中append实例用法总结
Jul 30 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
python 异步async库的使用说明
May 04 Python
pycharm 实现调试窗口恢复
Feb 05 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发送post请求函数分享
2014/03/06 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
解决Laravel blade模板转义html标签的问题
2019/09/03 PHP
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
浅析PEP572: 海象运算符
2019/10/15 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
python爬虫scrapy框架的梨视频案例解析
2021/02/20 Python
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
小学美术教学反思
2014/02/01 职场文书
食品业务员岗位职责
2014/03/18 职场文书
中学生英语演讲稿
2014/04/26 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
机关党员进社区活动总结
2014/07/05 职场文书
自主招生自荐信怎么写
2015/03/24 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS