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#" ...
随机推荐
- Taro 是一套遵
https://github.com/NervJS/taro 使用 Taro,我们可以只书写一套代码,再通过 Taro 的编译工具,将源代码分别编译出可以在不同端(微信小程序.H5.React-Nat ...
- MySQL Database on Azure服务在中国正式商用
基于由世纪互联运营的Windows Azure平台,MySQL Database on Azure服务助力中国用户实现数据库在云端的快速部署.推进用户的创新开发 2015年9月10日,北京——微软中国 ...
- 沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同
沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同 一.前言 想必大家都有这样的困惑,接触的东西越多却越来越混乱了,这个时候就要进行对比和深入的探讨了,抓住每一个概念背后 ...
- 骑士周游问题跳马问题C#实现(附带WPF工程代码)
骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...
- 深入浅出SharePoint——定制保存Item按钮
<script type="text/javascript" src="/_layouts/style/jquery-1.4.4.min.js">& ...
- December 07th 2016 Week 50th Wednesday
Life is a flower, and love is the honey of the flower. 人生是花儿,而爱情就是花的蜜. My life is not as beautiful a ...
- Spring Security 静态资源访问
在搞 Spring Security 的时候遇到了一个小坑,就是静态资源加载的问题. 当我们继承了 WebSecurityConfigurerAdapter的时候,会去重写几个方法.去设定我们自己要过 ...
- Oracle 11g简体中文版的安装过程及图解
1.下载Oracle 11g 地址 http://download.oracle.com/otn/nt/oracle11g/win32_11gR1_database_1013.zip 基本安装 解压缩 ...
- vi编辑器的命令详情
选定文本块,使用v复制选定块到缓冲区,使用y复制整行,用yy在同一编辑窗打开第二个文件,用:sp [filename]在多个编辑文件之间切换,用^ww剪切块,用d剪切整行用dd粘贴缓冲区中的内容,用p ...
- HashMap源代码解析
HashMap原理剖析 之前有看过别人的HashMap源代码的分析,今天尝试自己来分析一波,纯属个人愚见.听一些老的程序员说过,当别人跟你说用某样技术到项目中去,而你按照别人的想法实现了的时候,你只能 ...