正则表达式之字符转义,替换,反义

1. 字符转义

在上一篇介绍正则表达式重复量词的时候,已经接触到了字符转义,如果正则表达式想要匹配的字符恰好是特殊代码或者重复量词等其他正则表达式里用于描述规则的字符,那么就需要使用字符转义。

比如你想匹配+ 或者 ?,那么你要在正则表达式里写成 + 和 \? 这样,他们就代表字符加号和问号,而不是重复几次,如果想匹配\, 则写成\。

2. 替换

个人认为,替换这次对正则的描述不够准确,我一直都把 | 理解成或者的意思,| 在c语言,c++语言中就是或逻辑运算符。

假设目标字符串是

this is a book

如果想匹配this 和 book两个单词,正则表达式可以写成

\bthis\b|\bbook\b

或者匹配得上this,或者匹配得上book,总之两个单词,哪个都可以匹配。

再比如,写一个可以匹配手机号的表达式,我们都知道,手机号的前3位是号码段,这个号码段收集整理一下是可以穷举的,后8位就没有什么要求,不考虑国际区号的话,一个电话号的正则表达式可以写成

(13[0-9]|14[5,7,9]|15[0-3,5-9]|166|17[0-3,5-8]|18[0-9]|19[8,9])\d{8}

小括号里一共有7个号码段

  1. 13[0-9] 前两位是13,第3位是0到9
  2. 14[5,7,9] 前两位是14, 第3位是5, 7, 9
  3. 15[0-3,5-9] 前两位是15,第3位是0到3或者5到9
  4. 166
  5. 17[0-3,5-8] 前两位是17,第3位是0到3或者5到8
  6. 18[0-9] 前两位是18 第3位是0到9
  7. 19[8,9] 前两位是19 第3位是8,9

在匹配时,这7个号码段有任意一个匹配上就可以,后8位则全是数字。

在这个表达式里,出现了中括号[], 这个中括号的作用是指定一个字符范围。

3. [] 指定一个字符范围

特殊代码. \w \s \d 所指定的字符,范围太大了,不够灵活,比如我只想匹配0到5 这个范围内的数字,使用\d就不行了,虽然可以写成 0|1|2|3|4|5 ,但使用起来不够方便,对于这种情况,就可以使用中括号

[0-5]  # 表示从0到5的字符
[a-z]  # 表示从a到z的字符
[a-zA-Z0-5] # 多个范围
[+?]  # 表示+ 或者 ? 在中括号里,特殊字符可以不使用字符转义

4. 反义

前面的内容都是在讲如何匹配指定字符的方法,如果想要匹配字符之外的内容,该如何处理呢,比如我只想匹配除了数字意外的任意字符,这个就要用到反义

代码/语法 说明
\W 匹配任意不是字母和数字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[a-z] 匹配除了小写字母意外的任意字符

假设我们希望字符串只能由小写字母和数字构成,那么正则表达式应该写成

^[a-z0-9]+$

如果希望字符串里不能出现数字,正则表达式可以写成

^[^0-9]+$

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案