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关闭windows进程的方法
Apr 18 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Python操作MySQL数据库的三种方法总结
Jan 30 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
Django Celery异步任务队列的实现
Jul 24 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
May 26 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 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 URL跳转代码 减少外链
2011/06/25 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
实例详解Node.js 函数
2018/06/10 Javascript
Python闭包实现计数器的方法
2015/05/05 Python
Python 处理数据的实例详解
2017/08/10 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python通过zabbix api获取主机
2018/09/17 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python ftplib模块使用代码实例
2019/12/31 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
关于旷工的检讨书
2014/02/02 职场文书
工地安全检查制度
2014/02/04 职场文书
小学综合实践活动总结
2014/07/07 职场文书
国庆节活动总结
2014/08/26 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
避暑山庄导游词
2015/02/04 职场文书
营业员岗位职责
2015/02/11 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL