0%

正则表达式笔记

可能用得到

用法

防止过度匹配

使用? 比如

* 改为 *?

匹配\<b\>标签:

<[Bb]>.*?</[Bb]>

单词边界

使用不匹配边界使用,比如 匹配字符串使用^元字符

子表达式

使用(),例如

(&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正则。Vim里面的正则也自己搞了一套,跟别的不太一样
  2. win下面的空格和换行和linux下面不一样
  3. 懒惰匹配基本大部分正则库都是向后的,双向的懒惰匹配并没法用,比如<p>.*?主诉.*?</p>并不能找出包含主诉的段落,实际上会找出从第一个p到包含主诉那个段落结束

推荐

  1. https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md 一个简短教程
  2. https://regex101.com/ 在线练习和测试网站
  3. https://regexr.com/ 另一个网站,感觉功能比上面那个强,但只支持javascript和php
  4. https://github.com/any86/any-rule 一些常用的正则