Python-正则零宽断言及命名捕获(类PHP)
(一)零宽断言
说明:本文的例子使用python描述
首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。
正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。这些简单的就不说了,今天主要说一下界定的使用方法(有些资料叫环式结构,名字而已,不重要)。界定也是一种零宽断言,界定主要有四类:
1、前向界定(肯定顺序环视)(?=exp)
表示右边要匹配exp表达式
strTest = "aaa111aaa , bbb222&, 333ccc" strRe = r"\d+(?=[a-z]+)"
reObj = re.compile(strRe) print reObj.findall(strTest)
输出:(正则的意思是找出连续的数字并且最后一个数字跟着至少一个a-z里面的字符序列)
['', '']
2、前向否定界定(否定顺序环视)(?!exp)
表示右边不匹配exp表达式
strTest = "aaa111aaa , bbb222&, 333ccc" strRe = r"\d+(?![a-z]+)"
reObj = re.compile(strRe) print reObj.findall(strTest)
输出:(正则的意思是找出连续的数字,并且最后一个数字后面不能跟任何一个a-z里面的字符序列)
['', '', '']
3、反向界定(肯定逆序环视)(?<=exp)文本必须定长
表示左边要匹配exp表达式
strTest = "aaa111aaa , bbb222&, 333ccc" strRe = r"(?<=[a-z])\d+"
reObj = re.compile(strRe) print reObj.findall(strTest)
输出:(正则的意思是找出连续的数字,并且第一个数字的前面要是a-z中的一个字符)
['', '']
4、反向否定界定(否定逆序环视)(?文本必须定长
表示左边不要匹配exp表达式
strTest = "aaa111aaa , bbb222&, 333ccc" strRe = r"(?<![a-z])\d+"
reObj = re.compile(strRe) print reObj.findall(strTest)
输出:(正则的意思是找出连续的数字,并且第一个数字的前面不能是a-z中的一个字符)
['', '', '']
这里要注意的一个问题是:在python和Perl中两个反向界定的表达式exp只允许使用定长文本,譬如最后第四个例子,如果正则表达式写成:strRe = r"(?,py解释器会报错:error: look-behind requires fixed-width pattern。
(二)命名组和无捕获组
python里面还有一种命名组和无捕获组
命名组比较牛×,也是python的扩展,能把捕获组向使用字典一样的使用:
s = 'Tom:9527 , Sharry:0003'
m = re.match( r'(?P\w+):(?P\d+)' , s) print m.group()
print m.group(0)
print m.group(1)
print m.group(2)
print m.groups()
print m.group("name")
print m.group("num")
输出
Tom:9527
Tom:9527
Tom
9527
('Tom', '')
Tom
9527
无捕获组的使用也是类似,语法:(?:exp)只是无捕获组匹配exp,但不捕获匹配的文本,也不给这个组分配组号。
Python-正则零宽断言及命名捕获(类PHP)的更多相关文章
- Regex 正则零宽断言
http://baike.baidu.com/link?url=sLfovpZmIcS5Uz_tiidXoVtjl30Tu3wARMfhnEcbgEGzsb8g1z7dvtGNXTulu1KDodmi ...
- $python正则表达式系列(5)——零宽断言
本文主要总结了python正则零宽断言(zero-length-assertion)的一些常用用法. 1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面 ...
- Python爬虫学习(4): python中re模块中的向后引用以及零宽断言
使用小括号的时候,还有很多特定用途的语法.下面列出了最常用的一些: 表4.常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>e ...
- 正则 ?<= 和 ?= 用法 以及零宽断言等概念
正则 ?<= 和 ?= 用法 参考网址:http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwW ...
- 从零宽断言说起到用python匹配html标签内容
版权声明:本文为博主原创文章,转载请附带原文网址http://www.cnblogs.com/wbchanblog/p/7411750.html ,谢谢! 提示:本文主要是讲解零宽断言,所以阅读本文需 ...
- Python正则表达式进阶-零宽断言
1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面或后面需要是特定的内容,但我们又不想要前面或后面的这个特定的内容,这时候就需要零宽断言的帮助了.所谓零 ...
- JS不支持正则中的负向零宽断言
今天在项目中用到了正则表达式,并且需要用负向零宽断言 (?<=exp) 进行筛选,结果运行时报 Invalid group 错,一开始以为是自己很久没用表达式写错了,查阅了一下正则语法后发现并没 ...
- js正则:零宽断言
JavaScript正则表达式零宽断言 var str="abnsdfZL1234nvcncZL123456kjlvjkl"var reg=/ZL(\d{4}|\d{6})(?!\ ...
- js正则之零宽断言
我们学到的正则表达式匹配,都是有“宽度”的,使用 \w+. 匹配下面文本,会将 . 一同匹配: regular. expression. 如果不想匹配符号,只匹配一个位置,就要用到“零宽断言”(匹配宽 ...
随机推荐
- 理解NSTextContainer
Apple的Doc对这个类的描述是这样的: The NSTextContainer class defines a region where text is laid out. An NSLayout ...
- Oracle 中批量导入大量测试数据的方法
执行如下批处理命令: declare maxrecords constant int := 100000; i int := 1;begin for i in 1 .. 20000 loop ...
- 【FreeBuf视频】《安全大咖说》专访知道创宇CTO杨冀龙(watercloud)
[FreeBuf视频]<安全大咖说>专访知道创宇CTO杨冀龙(watercloud) 发布于 2016/05/16 FreeBuF.COM 杨冀龙,江湖人称watercloud,知道创宇公 ...
- hdu 2075
PS:水得不能再水..刚开始还以为是大数..要用到快速幂...谁知道想太多...就普通int型.. 代码: #include "stdio.h" int main(){ int a ...
- 【Tsinghua OJ】隧道(Tunel)问题
描述 现有一条单向单车道隧道,每一辆车从隧道的一端驶入,另一端驶出,不允许超车 该隧道对车辆的高度有一定限制,在任意时刻,管理员希望知道此时隧道中最高车辆的高度是多少 现在请你维护这条隧道的车辆进出记 ...
- 3、C#基础整理(语句概述)
语句 语句分为四个大类: * 分支语句:if,if... else,if ...else if... else,switch case * 循环语句:for,while,do while,foreac ...
- 重定位shell
http://www.tldp.org/LDP/abs/html/io-redirection.html http://unix.stackexchange.com/questions/20469/d ...
- Python 如何跳出多重循环
Python 如何跳出多重循环 抛异常 return
- 微软官方好用的Office 2003、 Office 2007 或 Office 2010 卸载工具
http://support.microsoft.com/kb/2519420/zh-cn
- 利用curl计算网络文件大小
; CURL *handle = curl_easy_init(); curl_easy_setopt(handle, CURLOPT_URL, url); curl_easy_setopt(hand ...