最近工作终于闲了下来,可以上班研究代码。遇到一些需要正则表达式的编程问题,无法解决所以决定个学一下。
Regex 101 - ZH-CN (regexlearn.com)
简单
匹配单词
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次
color
, colour
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 3
PM
\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