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 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
利用aardio给python编写图形界面
Aug 21 Python
python+opencv实现动态物体追踪
Jan 09 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python软件都是免费的吗
Jun 18 Python
详解Python调用系统命令的六种方法
Jan 28 Python
python 使用openpyxl读取excel数据
Feb 18 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
PHP中session跨子域的三种实现方法
2016/07/25 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
快速搭建React的环境步骤详解
2017/11/06 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
封装Vue Element的table表格组件的示例详解
2020/08/19 Javascript
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
django中瀑布流写法实例代码
2019/10/14 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
Tensorflow的常用矩阵生成方式
2020/01/04 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
python生成xml时规定dtd实例方法
2020/09/21 Python
简约控的天堂:The Undone
2016/12/21 全球购物
综合素质的自我鉴定
2013/10/07 职场文书
厂长岗位职责
2014/02/19 职场文书