正则表达式 - Python 正则表达式 学习笔记 最全整理

正则表达式

regular expression,用于匹配字符串中字符组成的方法,“用有限的符号表达无限的序列”。
JavaScript
正则表达式语法如下:
/xxx/gi
两条斜线中间是正则主体,可以有很多字符组成;gi 部分是修饰符。
默认正则是区分大小写,正则提供了修饰符的功能:

  • g :正则遇到第一个匹配的字符就会结束,加上全局修复符,可以让其匹配到结束
  • i :正则默认是区分大小写的,i 可以忽略大小写
  • m : 正则默认遇到换行符就结束了,不能匹配多行文本,m 可以让其匹配多行文本

1. 普通字符

直接匹配,无特殊含义。所寻即所得,没有例外延伸。

/abc/    就能且仅能匹配 "abc" 字符按照顺序同时出现的情况,不能匹配"ab c" 等。

/--_/     匹配  --_

2. 特殊字符

2.1 断言 Assertions

表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始或终止部分(如先行断言,后行断言以及条件表达式)。

2.1.1 边界类断言
字符 含义
^ 匹配输入的开头。如果多行模式设为 true,^ 在换行符后也能立即匹配,比如 /^A/ 匹配不了 “an A” 里面的 “A”,但是可以匹配 “An A” 里面第一个 “A”。
$ 匹配输入的结束。如果多行模式设为 true,$ 在换行符前也能立即匹配,比如 /t$/ 不能匹配 “eater” 中的 “t”,但是可以匹配 “eat” 中的 “t”。
\b 匹配一个单词的边界。\b 在前表示以某字符/串开头,\b 在后表示以某字符/串结尾。
将 \b 理解为占位符的话,其代表一个空格。
这是一个字的字符前后没有另一个字的字符位置,例如在字母和空格之间。
需要注意的是匹配的单词边界不包括在匹配中。换句话说,匹配字边界的长度为零。
如:/\bc/ 在’city’中匹配到‘c’;
/it\b/ 在’city’中不会匹配到‘it’,因为t后面有y;
/ity\b/ 在’city’中匹配到‘ity’;
/\w\b\w/ 将永远不会匹配任何东西,因为一个单词字符后面永远不会同时有一个非单词字符和一个单词字符。
\B 匹配非单词边界。\B 在前表示 某字符串不在开头,\B 在后表示 某字符串不在结尾。
可将 \B 理解为代表一个非空格。
这是上一个字符和下一个字符属于同一类型的位置:要么两者都必须是单词,要么两者都必须是非单词,例如在两个字母之间或两个空格之间。
字符串的开头和结尾被视为非单词。与匹配的词边界相同,匹配的非词边界也不包含在匹配中。
如,/\Bme/ 在 become big 匹配 me;
/ci\B/ 在 arrive city 匹配 ci 。
一般边界类型示例
// 使用正则 边界 修复错误字符串
s1= '0nce up0n a time \
0n the state,thare are teppy fammm';

// 1. 使用 ^ 修正字符串开始处和换行后的匹配
s1=s1.replace(/^0/gim,'o');
console.log(1, s1); // 改正 0nce -once(开始处),0n -on (换行后)

// 2. 使用 $ 改正字符串结尾处的匹配
s1=s1.replace(/mm$/gim,'ily');
console.log(2,s1); // 改正 mm -ily

// 3. 使用 \b 改正单词和空格边界上的字符
s1.s1.replace(/\bte/gim,'ha');
console.log(3,s1); // teppy - happy

// 4. 使用 \B 匹配实体边界内的字符
s1=s1.replace(/\Bar/gim,'er');
console.log(4,s1); // thare - there

// 使用 ^匹配输入的开头
// 为了选择合适的水果,我们可以使用带有箭头函数的过滤方法。
let fruits = ["peach", "Watermelon", "plum 李子", "avocado", 'apricot杏子','tangerine 橘子',"pear"];

// 使用正则 /^p/ 选择以'p'开头的水果。
// 这里的 '^' 只有一种含义:匹配输入的开头。
let fa = fruits.filter(fruit => /^p/.test(fruit));
console.log(fa); 
// 使用正则 /^[^p]/ 选择 不是以‘p’开头的水果
// 在这个例子中,“^”控件符号表示两种含义:
// 1) 匹配输入的开头
// 2) 一个否定的字符集:[^p] ,意思是匹配不是‘p’的字符
let fp = fruits.filter(fruit => /^[^p]/.test(fruit));
console.log(fp); 
//匹配字边界
let fruitsWithDescription = ["Red apple", "Orange orange", "Green Avocado"];

// 选择包含以“en”或“ed”结尾的单词的描述
let enEdSelection = fruitsWithDescription.filter(descr => /(en|ed)\b/.test(descr));
console.log(enEdSelection); // [ 'Red apple', 'Green Avocado' ]
2.1.2 其他断言
字符 含义
x(?=y) 先行断言: x 被 y 跟随时,匹配 x。
如:/Martin(?=Tone)/ martin 在后跟有Tone时才会匹配。
/Martin(?=Stu|Tone)/ martin 在跟有Stu或Tone时才会匹配。
不过匹配结果不包括Stu或Tone。
x(?!y) 先行否定断言: x 没有被 y 紧随时匹配 x。
如:/\d+(?!\.)/ ,数字后没有跟随小数点时才会匹配。/\d+(?!\.)/.exec(6.181),匹配‘181’而不是‘6’ 。
(?<=y)x 后行断言: x 跟随 y 的情况下匹配 x。
如:/(?=Tone)Martin/ martin 跟随Tone时才会匹配。
/(?=Stu|Tone)Martin/ martin 跟随Stu或Tone时才会匹配。
不过匹配结果不包括Stu或Tone。
(?<!y)x 后行否定断言: x 不跟随 y 时匹配 x。。
如,/(?<!-)\d+/,数字不紧随 - 符号的情况下才会得到匹配。。
/(?<!-)\d+/.exec(8) ,8得到匹配。 而/(?<!-)\d+/.exec(-8)的结果无匹配,这是由于数字之前有 - 符号。
示例
// 先行断言
let regex=/what(?= come)/g;
console.log('what come first'.match(regex)); // ['what']
console.log('come what comon for'.match(regex)); //null

// 不同含义的'?!':断言和范围的组合用法
// 不同含义的?! 结合使用 断言 /x(?!y)/ 和 范围 [^?!].
let orangeNotLemon = "Do you want to have an orange? Yes, I do not want to have a lemon!";

let selectNotLemonRegex = /[^?!]+have(?! a lemon)[^?!]+[?!]/gi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值