python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)
目的:把数字后面不为abc的字符串找出来
如1ab符合要求,2abc不符合要求
str = '1ab'
out = re.match(r'\d+(?!abc)',str) str1 = '1abc'
out1 = re.match(r'\d+(?!abc)',str1) print('out:',out)
print('out1:',out1)
#
#out: <_sre.SRE_Match object; span=(0, 1), match='1'>
#out1: None
#
如果把(?!abc)改为[^abc],效果如下:
str = '1ab'
out3 = re.match(r'\d+[^abc]',str) str1 = '1abc'
out4 = re.match(r'\d+[^abc]',str1) print('out:',out3)
print('out1:',out4) #
#out3: None
#out4: None
总结:
(?!abc)是把abc当做一个整体进行匹配,字符串中不存在abc才能成功,abc作为一个整体进行匹配
[^abc]只要字符串中存在a/b/c中的任一个即匹配不成功,字符串中不能出现a/b/c中的任一个
------------------------------------------------------------------
更新:
之前没有注意到(?!abc)方式匹配字符串不消耗字符串内容这句话,导致如果字符串中间排除一个子字符串时会出现错误。
更新关于这部分的理解
(?=...) # 匹配字符串,且紧挨着匹配的字符串之后的字符等于...,才算匹配成功,且不消耗字符串内容
(?!...)
# 匹配字符串,且紧挨着匹配的字符串之后的字符不等于...,才算匹配成功
,且不消耗字符串内容
(?<=...)
# 匹配字符串,且紧挨着匹配的字符串之前的字符等于...,才算匹配成功
,且不消耗字符串内容
(?<!...)
# 匹配字符串,且紧挨着匹配的字符串之前的字符不等于...,才算匹配成功
,且不消耗字符串内容
具体理解:
以(?=...)
为例
reg = re.compile('A(?=BC)')
reg.search('ABC')
reg.search('ABCDE') # 输出:
# <_sre.SRE_Match object; span=(0, 1), match='A'>
# <_sre.SRE_Match object; span=(0, 1), match='A'>
reg_1 = re.compile('A(?=BC)D')
print(reg_1.search('ABCD')) # 输出
# None
reg = re.compile('A(?=BC)')
reg.search('ABC')
在这种情况下,匹配一个字符,这个字符包含'A',且'A'后面的字符为'BC',字符串'ABCD'符合规律
但是,
reg_1 = re.compile('A(?=BC)D')
reg_1.search('ABCD')
就会出现问题,因为(?=...)括号内的表达式不消耗字符,也就是说匹配完字符串中的'A'之后,会判断A之后的字符是否是'BC',匹配成功后正则表达式会继续匹配字符串中'A'之后的字符是否是'D'
但是,在字符串中'A'之后是'B'就会出现匹配失败,返回None.
https://blog.csdn.net/lxcnn/article/details/4304651 在这个链接中,解释比较清楚.
在正则匹配过程中,各个子表达式会依次取得控制权,对字符串进行匹配.
比如例子中的
reg_1 = re.compile('A(?=BC)D')
1.'A(?=BC)D' 中,表达式'A'首先取得控制权,从字符串'ABCD'的开始位置('A'之前)进行匹配;
匹配成功,控制权交给下一个正则子表达式(?=BC),匹配位置移动到字符串'ABCD'中的'A'之后('B'之前)
2.正则子表达式(?=BC)取得控制权,对当前匹配位置的右侧字符进行匹配,判断是否等于(?=BC)中的'BC'(即'A'后的'BC');
匹配成功,控制权交给下一个正则子表达式'D',但是,因为(?=...)表达式不消耗字符,也就是说这个表达式是零宽度的,因此匹配位置不会往后移动.匹配位置依然在'A'之后.
3.正则子表达式'D'取得控制权,对当前位置('A'之后'B'之前)的右侧字符进行匹配,判断'A'之后的字符是否等于'D'.
字符串'ABCD'中,'A'之后为'B',匹配失败
4.进行下一轮匹配,又回到表达式'A'取得控制权,开始匹配位置不再是字符串首位置,此时从字符串'ABCD'中的'A'之后'B'之前的位置开始匹配,重复1~3步骤,不断移动匹配位置进匹配 整个正则表达式匹配过程明了了. 不消耗字符串的意思就是这个子表达式为零宽度的,在匹配结束后不会向后移动匹配位置
python3 正则匹配[^abc]和(?!abc)的区别(把多个字符作为一个整体匹配排除)的更多相关文章
- 正则匹配中 ^ $ 和 \b 的区别
正则匹配中 ^ $ 和 \b 的区别 ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可 ...
- Python3正则匹配re.split,re.finditer及re.findall函数用法详解
这篇文章主要介绍了Python3正则匹配re.split,re.finditer及re.findall函数用法,结合实例形式详细分析了正则匹配re.split,re.finditer及re.finda ...
- 转转转---js正则表达exec与match的区别说明
正则表达式对象有两个定义方式:: 1.第一种定义: new RegExp(pattern, attributes);如var reg = new RegExp("abc",&quo ...
- 【转载】python3.0与2.x之间的区别
python3.0与2.x之间的区别: 1.性能 Py3.0运行pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好 ...
- python3.0与2.x之间的区别
python3.0与2.x之间的区别: 1.性能 Py3.0运行pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好 ...
- js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global)
js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global) 一.总结 1. ...
- Python3正则去掉HTML标签
Python3正则去掉HTML标签 1.引用一段代码 import re html = '<pre class="line mt-10 q-content" accuse=& ...
- servlet匹配路径时/和/*的区别(转)
本文转自https://blog.csdn.net/rongxiang111/article/details/53008829 一.<url-pattern>/</url-patte ...
- jquery[siblings]取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合
取得一个包含匹配的元素集合中每一个元素的所有唯一同辈元素的元素集合,用于筛选同辈元素的表达式 $("#pageList").click(function(){ $(this).pa ...
随机推荐
- ELK 起航
ELK与我 我在2017年8月份第一次听说ELK并搭建了一次,当时看到KIBANA页面超级炫酷非常激动.现在已经过去了四个月了,现在的情况不像刚开始哪有无知了.现在是要应用到实际的项目中.首先说一下整 ...
- 《DSP using MATLAB》Problem 7.15
用Kaiser窗方法设计一个台阶状滤波器. 代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- node环境下express路由,
1.基本路由概念 路由是指确定应用程序如何响应对特定端点的客户端请求,该请求是URI(或路径)和特定HTTP请求方法(GET,POST等). 每个路由都可以有一个或多个处理函数,这些函数在路由匹配时执 ...
- linux下用ctrl+r快速搜索history命令
前提是,搜索已经使用的命令,否则是查不出来结果的. ctrl+r用途:反向搜索执行过的命令.(reverse-i-search) 1.任何目录下按住ctrl + r 2.输入历史命令中的字符串 ,比如 ...
- EBS WEBADI无法创建文档
有些小伙伴在使用WEBADI时,下载模板之后会发现模板创建文档一直没有成功(没有报错,只是单纯的没有创建出文档),可以参考: http://blog.csdn.net/cyco008/article/ ...
- 面向对象A 知识点总结
- VLC播放器
为了将多个视频放在一个窗口,最开始想用的是windows media player ,6个视频,把整个电脑卡得不动了(显卡太弱,是多输出口的,没法换),于是又想把视频压缩成一个,网上的大部分软件要收费 ...
- C 标准库头文件
头文件 说明 头文件 说明 <assert.h> 条件编译宏,将参数与零比较 <complex.h> (C99 起) 复数运算 <ctype.h> 用来确定包含于字 ...
- C# 特性(Attribute)之Serializable特性
转载自:https://www.cnblogs.com/GreenLeaves/p/6753261.html 介绍之前,先说一个重要的知识点: Serializable属性并不序列化类,它只是一个标签 ...
- 辨析字节序(Endianness)
字节序(Endianness, Byte Order)指的是对于一个多字节数值,当在内存中存储该值或者在链路中传输该值时,其值所包含的多个字节的排列顺序. 在计算机科学中,一般存在两种字节序,大端字节 ...