2023-01-06-Regex

发布时间 2023-10-09 18:42:33作者: kasusa

最近工作终于闲了下来,可以上班研究代码。遇到一些需要正则表达式的编程问题,无法解决所以决定个学一下。

Regex 101 - ZH-CN (regexlearn.com)

Regex Learn - 练习场

Regex Learn - cheatsheet

练习题

简单

匹配单词

he is in black.

black

. 允许匹配任何字符,包括特殊字符和空格

A B C D E

.

肯定字符集 [abc] 匹配字母可以用[a-z] 匹配数字可以用[0-9] 或者 \d

bar ber bir bor bur

b[aeiou]r

否定字符集[^abc]

bar ber bir bor bur

b[^ei]r

字母范围[a-z]

重复? + *

? 加在字母后代表出现0次或1次

colorcolour

colou?r

+ 加在字母后代表出现1次或多次

br ber beer

be+r

* 加在字母后代表出现0次或多次

br ber beer

be*r

大括号

{x}加在字母后代表出现x次

ber beer beeer beeeer

be{2}r

{n, }加在字母后代表出现n到正无穷次,类似集合,[n,∞)

ber beer beeer beeeer

be{3,}r

分组()

分组可以只抓取匹配到的字符中的一部分。(通常也可以全都获取到再replace)

file_record_transcript.pdf

(.*).pdf$

在python种可以这样使用

import re  
txt = "The rain in Spain.pdf"  
x = re.match("(^The.*).(pdf)$", txt)  
print(x.group(1)) #The rain in Spain  
print(x.group(2)) #pdf

() 分组可以把上面的重复符号给组用。而不只是一个字母。

\1,\2 分组引用,可以把组像变量一样引用。第一组就是\1

ha-ha,haa-haa

(ha)-\1,(haa)-\2

像当于是:

(ha)-(ha),(haa)-(haa)

(?: ): 非捕获分组 (不能被引用)

ha-ha,haa-haa

(?:ha)-ha,(haa)-/1

转义字符 \

{ } [ ] / \ + * . $^ | ? 如果要这些特殊字符,需要在前面加上反斜杠匹配

匹配开头 ^

1. 3 eggs, beaten

2. 1 tsp sunflower oil

3. 1 tsp butter

^[0-9]

匹配尾巴 $

html.html.html-da-sdfhtml

html$

匹配字符 \w

字母、数字和下划线 \w,其他各种不在这范围内的 \W (匹配中文和中文标点可以使用\W)

数字\d,非数字\D

空白符\s,非空白\S

Lookarounds

官方中文翻译:零宽断言,我觉得这个翻译真的是误导人,“断言”:极其肯定地说,断言你妈,还零宽,就不说人话是吧。
应该叫:附近匹配/左右匹配。

其实我觉得如果后缀前缀不变的话,可以吧这段比如3PM一起给match出来,然后再replace PM 就可以了,比这个奇怪的语法看起来要好一些。

看看后面(指定尾缀)

Date: 4 Aug 3PM

\d+(?=PM)

后面不要!(指定不要的尾缀)

Date: 4 Aug 3PM

\d+(?!PM)

看看前面

Product Code: 1064 Price: $5

(?<=\$)\d+

前面不要!

Product Code: 1064 Price: $5

(?<!\$)\d+

全局标志/gmi

g - 获取全部,不加上只获取第一个

m - 多行,如果不开启则全部文本视作一行,对于有匹配文本末端$的有影响

i - 大小写不在意,不加上则大小写敏感

贪婪匹配

正则表达式默认执行贪婪匹配,能要长的就不要短的

ber beer beeer beeeer

.*r

懒惰匹配? 还记得吗,?代表出现0次或1次

ber beer beeer beeeer

.*?r