Python 正则:前后界定和前后非界定
在用正则去匹配识别手机号、QQ、微信号的时候,往往由于输入的文本可能非常的另类,比如,没有标点和隔断,这时`^`和`$`就用不上了。
不用其实也可以识别的,但是有个问题,手机后是11位数字,QQ是5~11或者更多数字,有可能从手机号中破坏性的匹配到QQ号。当然,此一类问题前后界定和前后非界定都适用。
前后界定和前后非界定中的界定的意思是:边界字符限制必须是或必须不能是的意思。
官方说法:
(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) :代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。
(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion) :代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。
(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion) :代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。
(?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion) :代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。
为了说明问题,假设QQ是最长10位,最少5位的数字:
>>> import re >>> cont = "小强的手机号是15877966552" >>> print re.findall(r"[1-9]\d{4,9}",cont) [']
结果,正则从手机号中匹配到了结果,这是不对滴。有了前后非界定就好了:
>>> print re.findall(r"[1-9]\d{4,9}(?!\d)",cont) []
再例如,文本中出现了成对的符号或字符,但实际上需要的是其内的部分,就用到了前后界定了:
>>> cont = "str = '小强的手机号是15877966552'" >>> print re.findall(r"(?=\').*(?=\')",cont) ['\xe5\xb0\x8f\xe5\xbc\xba\xe7\x9a\x84\xe6\x89\x8b\xe6\x9c\xba\xe5\x8f\xb7\xe6\x98\xaf15877966552']
因此,`^`和`$`是包含某字符的匹配,前后界定和前后非界定是不包含某字符的匹配,明白后以便见方抓药。
前行符`<`的作用,就是字面上向前(向左查找),默认为向后(向右查找)。还是上面的字符匹配手机号:
>>> print re.findall(r"(?<=\D)1\d{10}(?!\d)",cont) ['] >>> print re.findall(r"(?<!\d)1\d{10}(?!\d)",cont) [']
参考:正则表达式的先行断言(lookahead)和后行断言(lookbehind)
Python 正则:前后界定和前后非界定的更多相关文章
- python正则中的贪婪与非贪婪
当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式.当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号.匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 ...
- python正则非贪婪模式
上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 单个匹配 ...
- Python正则式的基本用法
Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...
- python正则-re的使用
今天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了.所以现在呢,我们就一起来review一下python中正则模块re的用法吧. 今天是review,所以一些基础的概 ...
- python 正则,常用正则表达式大全
Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号: 改符号开始 从 ...
- Python正则处理多行日志一例
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- Python正则处理多行日志一例(可配置化)
正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...
- 认识python正则模块re
python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...
- python正则的中文处理(转)
匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...
随机推荐
- c# 设计模式 之:工厂模式之---工厂模式
1.uml类图: 实现和依赖关系: 实现: SportFactory.JeepFactory.HatchbackFactory 实现 IFactory 接口 SportCar.JeepCar.Hatc ...
- CentOS随笔 - 3.CentOS7安装Oracle 11g xe
前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 由于手上很多项目都是采用Oracle在进行开发, 所以安装Oracle成为必然. 当然有朋友会想为什么不安装1 ...
- leetcode Ch5-Linked List
一. 1. Remove Duplicates from Sorted List II class Solution { public: ListNode* deleteDuplicates(List ...
- 用FileZilla Server开FTP
FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...
- 多个 Word 文档合并为一个
如果您工作中经常要跟 Word 文档打交道,时不时的您可能需要将多个 Word 文档合并为一个.信息量少的时候,我们可以直接使用复制粘贴.除此之外,还有没有其它办法呢? 借助word2010/2007 ...
- 同时对view延时执行两个动画时候的现象
同时对view延时执行两个动画时候的现象 对于view延时执行了两个动画后,会将第一个动画效果终止了,直接在第一个动画的view的最后的状态上接执行后续的动画效果,也就是说,我们可以利用这个特性来写分 ...
- 乘风破浪:LeetCode真题_003_Longest Substring Without Repeating Characters
乘风破浪:LeetCode真题_003_Longest Substring Without Repeating Characters 一.前言 在算法之中出现最多的就是字符串方面的问题了,关于字符串的 ...
- xss challenges平台学习
虽然在很早之前就接触过xss,有一段时间还就着一本书研究过,但是始终没有实感,掌握的也不够系统,所以现在借着这几个平台再学习一遍 首先来玩一玩xss challenge平台 第一关:http://xs ...
- list 去重并保持原来排序
public <T> List<T> removeDuplicateKeepOrder(List<T> list){ /* Set set = new HashSe ...
- IntelliJ IDEA 与Eclipse Link with Editor等价功能设置
Link With Editor是Eclipse内置功能中十分小巧,但却异常实用的一个功能. 这个开关按钮 (Toggle Button) 出现在各式导航器视图 ( 例如 Resource Explo ...