在用正则去匹配识别手机号、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 正则:前后界定和前后非界定的更多相关文章

  1. python正则中的贪婪与非贪婪

    当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式.当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号.匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 ...

  2. python正则非贪婪模式

    上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 单个匹配 ...

  3. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  4. python正则-re的使用

    今天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了.所以现在呢,我们就一起来review一下python中正则模块re的用法吧. 今天是review,所以一些基础的概 ...

  5. python 正则,常用正则表达式大全

    Nginx访问日志匹配 re.compile #re.compile 规则解释,改规则必须从前面开始匹配一个一个写到后面,前面一个修改后面全部错误.特殊标准结束为符号为空或者双引号:  改符号开始 从 ...

  6. Python正则处理多行日志一例

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  7. Python正则处理多行日志一例(可配置化)

    正则表达式基础知识请参阅<正则表达式基础知识>,本文使用正则表达式来匹配多行日志并从中解析出相应的信息. 假设现在有这样的SQL日志: SELECT * FROM open_app WHE ...

  8. 认识python正则模块re

    python正则模块re python中re中内置匹配.搜索.替换方法见博客---python附录-re.py模块源码(含re官方文档链接) 正则的应用是处理一些字符串,phthon的博文python ...

  9. python正则的中文处理(转)

    匹配中文时,正则表达式规则和目标字串的编码格式必须相同 print sys.getdefaultencoding() text =u"#who#helloworld#a中文x#" ...

随机推荐

  1. html,css,javascript角色划分

    html负责文档的structure和content css负责文档内容的长相 javascript负责定义和文档的interaction交互

  2. SQL Server Management Studio 2012 键盘快捷键(转)

    无论是对于DBA还是Developer,键盘快捷键都是很常用的,动动键盘可比鼠标快多了,不过SQL Server 2012对SSMS(SQL Server Management Studio)中的快捷 ...

  3. 搭建企业级全网数据定时备份方案[cron + rsync]2

    1.1.1. rsync服务注意的问题 1.服务端 path=/backup/     -->带/ 2.客户端 rsync -avz /tmp/ rsync_backup@192.168.25. ...

  4. .NET Reflector注册问题

    reflector工具不错, 终于8.x了,也可以注册了,但是不小心注册成standard版本了,但vs中无法使用,于是各种删注册表,后来找到何英涛的解决方案 下面介绍一个Reflector很坑的一个 ...

  5. Linux下打包压缩war、解压war包和jar命令

    情景:把project_a文件夹下的文件打包成project.war 1. 打包 jar -cvf project.war /project_a 说明: -c 创建war包 -v 显示过程信息 -f ...

  6. December 21st 2016 Week 52nd Wednesday

    Keep conscience clear, then never fear. 问心无愧,永不畏惧. I find it is very difficult for me to keep consci ...

  7. ZT android -- 蓝牙 bluetooth (二) 打开蓝牙

    android -- 蓝牙 bluetooth (二) 打开蓝牙 分类: Android的原生应用分析 2013-05-23 23:57 4773人阅读 评论(20) 收藏 举报 androidblu ...

  8. ZT 布列瑟农

    布列瑟农 编辑 <布列瑟农>(Bressanone)是加拿大环保音乐家马修·连恩(Matthew Lien)创作并演唱的一首经典歌曲,收录在他1995年的专辑<狼>(Bleed ...

  9. [T-ARA][Sugar Free]

    歌词来源:http://music.163.com/#/song?id=29343991 作曲 : 新沙洞老虎/범이낭이 [作曲 : 新沙洞老虎/버미낭이] [作曲 : 新沙洞老虎/p/beo-mi- ...

  10. codeforces 1000F One Occurrence(线段树、想法)

    codeforces 1000F One Occurrence 题意 多次询问lr之间只出现过一次的数是多少. 题解 将查询按照左端点排序,对于所有值维护它在当前位置后面第二次出现是什么时候,那么查询 ...