Python的正则表达式

在学习Python的正则表达式之前,首先要学习标准的正则表达式理论,以下就主要介绍标准的正则表达式知识

定义

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

元字符

所谓元字符,就是正则表达式用以匹配字符的基本单位,也就是说所有实际文本的内容都要用以下法则进行匹配(仅例举了常用的)。

如果要看所有的列表可以看这里 https://www.runoob.com/regexp/regexp-metachar.html

加 ‘\’ 的元字符适用方法,如果我只想匹配某一个单词“WE”

\bWE\b

其他元字符的使用方法

.*(无限多任意字符

字符的转义

利用“\”来使用被元字符占用的字段,比如如果要匹配某一个网址

Www\.baidu\.com

限定符

所谓限定符,就是在元字符匹配条件的基础上,对元字符匹配行为进行的修饰

比如We\d?

匹配的结果就可以是We, We0, We7等

其他方法

字符集合

使用“[]”来匹配括号内的任一字符。

[abcde] → 匹配任意abcde中的一个

另外,还可以用“-”指定一个范围,比如

[a-z0-9A-Z] → 可以起到等同于\w的作用

分支条件(或逻辑)

用“|”把条件隔开,匹配出来的数据,至少会符合“|”两旁至少一个

比如:\d+|\w 至少会匹配一串数字或者一串字符

分支会默认从左到右,如果符合左,就不会去管右了

分支可以有很多个,届时用数个“|”即可,仍然默认从左往右匹配

反义

向后引用(其实是引用之前出现过的组的意思

使用括号能创建一个分组

比如可以使用  ((\d{1,3})\.){3}\d{1,3} 来匹配任意的IP地址

从第一个括号开始,默认其分组是1,很显然在这里$1是 ( \.)

从第二个括号开始。这里的分组是 (\d{1,3})

那么我可以使用 \1 \2来引用前面的分组从而避免重复

那么上述表达式就可以写成:

 ((\d{1,3})\.){3}\2

另外,还可以通过 (?<Digit>\d+) | (?’Digit’\d+) 来为分组命名,这样就可以使用组名来引用了

零宽断言

“\b”“^”匹配字符的开始与结束,是匹配一种位置,这个位置需要满足一定的条件,我们把这个条件称之为断言或者零宽度断言。断言用来声明一种应该为真的事实,只有断言为真时才会继续进行匹配。

(?=exp) 断言此位置后面的位置能匹配表达式exp

[a-z]*(?=ing) 匹配出 I love cooking and dancing 种的 cook 与 danc

这种断言的运作原理是,先会找到字符最右端的ing,再匹配前面的表达式

贪婪与懒惰

当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多,此为贪婪

那么,可以使用问号来开启相反的懒惰模式

Python的特殊规则

Python的特殊匹配

反斜杠

如果想匹配文字中的斜杠,在python中使用 r‘\\’ 即可

Python的正则支持

运行逻辑

python通过re模块提供对正则表达式的支持

python中一般把正则表达式转化成Pattern实例

然后利用Pattern实例来匹配文本结果

转写成Pattern

re.compile(string[,flag])

参数flag是匹配模式,可以使用“|”让其同时生效

匹配方法

re.match(pattern,string[,flag])

这种方法只匹配String的开头,开头匹配成功立刻返回,反之返回None

re.search(pattern,string[,flag])

这种方法会匹配整条String,其他与match一致

其他匹配方法

发表评论