最近工作终于闲了下来,可以上班研究代码。遇到一些需要正则表达式的编程问题,无法解决所以决定个学一下。
Regex 101 - ZH-CN (regexlearn.com)
简单
匹配单词
he is in black.
1black
. 允许匹配任何字符,包括特殊字符和空格
A B C D E
1.
肯定字符集 [abc] 匹配字母可以用[a-z] 匹配数字可以用[0-9] 或者 \d
bar ber bir bor bur
1b[aeiou]r
否定字符集[^abc]
bar ber bir bor bur
1b[^ei]r
字母范围[a-z]
重复? + *
? 加在字母后代表出现0次或1次
color, colour
1colou?r
+ 加在字母后代表出现1次或多次
br ber beer
1be+r
* 加在字母后代表出现0次或多次
br ber beer
1be*r
大括号
{x}加在字母后代表出现x次
ber beer beeer beeeer
1be{2}r
{n, }加在字母后代表出现n到正无穷次,类似集合,[n,∞)
ber beer beeer beeeer
1be{3,}r
分组()
分组可以只抓取匹配到的字符中的一部分。(通常也可以全都获取到再replace)
file_record_transcript.pdf
1(.*).pdf$
在python种可以这样使用
1import re
2txt = "The rain in Spain.pdf"
3x = re.match("(^The.*).(pdf)$", txt)
4print(x.group(1)) #The rain in Spain
5print(x.group(2)) #pdf
() 分组可以把上面的重复符号给组用。而不只是一个字母。
\1,\2 分组引用,可以把组像变量一样引用。第一组就是\1
ha-ha,haa-haa
1(ha)-\1,(haa)-\2
像当于是:
1(ha)-(ha),(haa)-(haa)
(?: ): 非捕获分组 (不能被引用)
ha-ha,haa-haa
1(?:ha)-ha,(haa)-/1
转义字符 \
{ } [ ] / \ + * . $^ | ? 如果要这些特殊字符,需要在前面加上反斜杠匹配
匹配开头 ^
1. 3 eggs, beaten
2. 1 tsp sunflower oil
3. 1 tsp butter
1^[0-9]
匹配尾巴 $
html.html.html-da-sdfhtml
1html$
匹配字符 \w
字母、数字和下划线 \w,其他各种不在这范围内的 \W (匹配中文和中文标点可以使用\W)
数字\d,非数字\D
空白符\s,非空白\S
Lookarounds
官方中文翻译:零宽断言,我觉得这个翻译真的是误导人,“断言”:极其肯定地说,断言你妈,还零宽,就不说人话是吧。 应该叫:附近匹配/左右匹配。
其实我觉得如果后缀前缀不变的话,可以吧这段比如3PM一起给match出来,然后再replace PM 就可以了,比这个奇怪的语法看起来要好一些。
看看后面(指定尾缀)
Date: 4 Aug 3PM
1\d+(?=PM)
后面不要!(指定不要的尾缀)
Date: 4 Aug 3PM
1\d+(?!PM)
看看前面
Product Code: 1064 Price: $5
1(?<=\$)\d+
前面不要!
Product Code: 1064 Price: $5
1(?<!\$)\d+
全局标志/gmi
g - 获取全部,不加上只获取第一个
m - 多行,如果不开启则全部文本视作一行,对于有匹配文本末端$的有影响
i - 大小写不在意,不加上则大小写敏感
贪婪匹配
正则表达式默认执行贪婪匹配,能要长的就不要短的
ber beer beeer beeeer
1.*r
懒惰匹配? 还记得吗,?代表出现0次或1次
ber beer beeer beeeer
1.*?r