正则的?:pattern, ?=pattern, ?!pattern学习整理
真正学习这次正则知识前,我是被这道题给难住了:
# 目标文本
str1 = "ever1, ever2, never1, never2, never3, forever1, forever2, forever3"
# 要求匹配到ever、forever 但是 不要never
expected = ['ever1', 'ever2', 'forever1', 'forever2', 'forever3']
方案1
[^n](?:for|)ever\d*
结果:
[' ever2', ' forever1', ' forever2', ' forever3']
由于[^n]即使没匹配到也会占用一个空格,所以只匹配到4条,第一个ever1无法匹配到(它前面无空格)
因此这里需要的是,不保存结果的匹配,我也叫他为“约束”,自然引来了下一种
方案2:
(?<!n)(?:for|)ever\d* # 此种正则使用了反向预搜索,json不支持
结果:
['ever1', 'ever2', 'forever1', 'forever2', 'forever3']
终于达成目的
Get1:
所以得出了所谓“预搜索”的作用,他只是约束,不参与匹配结果的生成。
同样作用的,还有(?=pattern) (?!pattern) (?<=pattern) (?<!pattern) \b \B etc
所以我最开始使用的[^n],他哪怕没有找到任何结果,都要占一个空格的坑,给匹配结果出一份力,就不属于这类“约束”语句
Get2:
(?:pattern)不属于上类的预搜索,如例子中:(?:for|)的意思,后面接了for 或者空 他是会直接拼接匹配结果的。
Get3:
(?=pattern) 与 (?<=pattern)的区别,都是预搜索,前者为正向预搜索,后者反向预搜索。谈谈我的粗陋理解
首先我们假定有个已经定死的,或者已经找到的东东叫book吧,然后以book为坐标原点
book(?=pattern) 匹配得:book(后面满足pattern)
所以正向匹配,遇到了book先不激动,再向右匹配,看是不是要的那个book,类似于:book(written by LuXun)
(?<=pattern)book 匹配得:(前面满足pattern的)book
所以逆向匹配,遇到了book后,反着向左匹配,看是不是所要的book, 类似于:(A good )book
最后贴上python代码,方便练习
str1 = "ever1, ever2, never1, never1, never2, never3, forever1222, forever2, forever3"
regex = r"(?<!n)(?:for|)ever\d*"
res = re.findall(regex, str1)
print(res)
正则的?:pattern, ?=pattern, ?!pattern学习整理的更多相关文章
- 正则、字符类Pattern、Matcher类
字符类 * [abc] a.b 或 c(简单类) * [^abc] 任何字符,除了 a.b 或 c(否定) * [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) * [0-9 ...
- [Design Pattern] Singleton Pattern 简单案例
Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 ...
- [Design Pattern] Factory Pattern 简单案例
Factory Pattern , 即工厂模式,用于创建对象的场景,属于创建类的设计模式 . 下面是一个工厂模式案例. Shape 作为接口, Circle, Square, Rectangle 作为 ...
- Linux中的小括号和大括号,${}/$()/()/{}/${var:-string}/${var:=string}/${var:+string}/${var:?string}/${var%pattern}/${var#pattern}/${var%%pattern}/${var##pattern}
简单记录一下大小括号在Linux中的用处. 1.${var},这是Linux中变量的原形.所以$var,别忘记了你的本来面目. # a= # echo $a # echo ${a} # echo ${ ...
- (?:pattern) 与 (?=pattern)的区别
共同点 (?:pattern) 与 (?=pattern)都匹配pattern,但不会把pattern结果放到Matches的集合中. 区别 (?:pattern) 匹配得到的结果包含pattern. ...
- java design pattern - adapter pattern
场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B ...
- Spring IOC设计原理解析:本文乃学习整理参考而来
Spring IOC设计原理解析:本文乃学习整理参考而来 一. 什么是Ioc/DI? 二. Spring IOC体系结构 (1) BeanFactory (2) BeanDefinition 三. I ...
- 常见c#正则表达式类学习整理
1.MatchCollection类 用于输入字符串所找到的成功匹配的集合,Regex.Matches 方法返回 MatchCollection 对象 用法 //str:要搜索匹配项的字符串 patt ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
随机推荐
- 011-通过安装percona插件监控MySQL
percona-monitoring-plugins是percona专门为MySQL监控的工具,支持Nagios,cacti,zabibx,本文主要介绍percona-monitoring-plugi ...
- C#操作目录和文件
C#操作目录和文件 创建目录和文件 1.通过Path类的Combine方法可以合并路径. string activeDir = @"C:\myDir"; string newPa ...
- passwd 修改用户密码 / chpasswd 批量更新用户密码
passwd 修改用户密码 1.命令功能 passwd 修改用户密码及密码过期时间等信息. 2.语法格式 passwd option username passwd 选项 用户名 选项说明 ...
- 使用RegisterPointerInputTarget时的一些注意事项
RegisterPointerInputTarget :允许调用者注册一个目标窗口,指定类型的所有指针输入都重定向到该窗口. 要使用它必须使 UIAccess = true,见下图 在设置完之后,需要 ...
- 循环结构——for语句、seq语句、while语句、break语句
1.for语句: 运行结果: 2.seq命令生成整数序列: 3.while语句: 执行结果: 4.break语句: break语句是正常结束之前退出当前循环. 执行结果: 5.continue语句: ...
- Puppet学习笔记(CentOS6.3+Puppet3.01)
Puppet学习笔记(CentOS6.3+Puppet3.01) 技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...
- 解决jmeter 请求参数中文乱码
今天在用jmeter 写脚本时发现查看结果树request post请求中文参数值是乱码,故记录下解决过程. 解决过程如下: 1.修改本地配置文件 因为此处的数据,还没有发送出去,所以,肯定是这个变量 ...
- 【ZJOJ1321】灯
题目 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望.她希望您能够帮帮她 ...
- 【NOIP2017模拟6.25】小W的动漫
题目 小W最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它的前传(父亲),也就是说,所有的 ...
- 输出到Excel
HSSFWorkbook oBook = new HSSFWorkbook(); NPOI.SS.UserModel.ISheet oSheet = oBook.CreateSheet(); #reg ...