0%

正则表达式笔记

可能用得到

用法

防止过度匹配

使用? 比如

* 改为 *?

匹配\<b\>标签:

<[Bb]>.*?</[Bb]>
单词边界

使用\b,不匹配边界使用\B,比如 \bcat\b 匹配单词cat
匹配字符串使用^元字符

子表达式

使用(),例如

(&nbsp;){2,}

匹配两个非换行空格

回溯引用

使用\1, 匹配一对html标签:

\<H1>\</H1>使用
<Hh([1-6])>.*?</[Hh]\1> 匹配

替换中也会用到\1
使用python的re库可以完成一些替换

re.sub(pattern, repl, string, count=0, flags=0)

这里重新排版电话号码

1
2
3
4
5
6
7
import re

phone = "123-456-7890"

# 将电话号重新排版为(123) 456-7890
num = re.sub(r"(\d{3})(-)(\d{3})(-)(\d{4})", r"(\1) \3-\5", phone)
print("phone-number: ", num)

结果

phone-number:  (123) 456-7891
前向查找

使用?=进行前向查找,?<=向后查找

比如,从https://zhangjk98.xyz/中找出协议https:

.+(?=:)

一些坑

1.很多支持正则表达式的地方差异很大,有的甚至不支持完整的正则表达式,比如linux命令中grep,只支持Basic RegEx,像? + () |这种元字符全都不支持,需要用-e-P参数使用扩展的正则或直接用Perl正则

  1. win下面的空格和换行和linux下面不一样

参考

  1. https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md 一个简短教程
  2. https://regex101.com/ 在线练习网站

附录

速查表