在处理字符串时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
行定位符
行定位符就是用来描述字符串的边界,“^
”表示行的开始,“$
”表示行的结尾。
^tm
该表达式表示要匹配字符串tm
的开始位置是行头,如“tm equal Tomorrow Moon
”可以匹配,而 “Tomorrow Moon equal tm
”则不匹配。
tm$
“tm equal Tomorrow Moon
”不可以匹配,而 “Tomorrow Moon equal tm
”则可以匹配。
如果要匹配的字符串可以出现在字符串的任意部分,那么可以直接写成下面的格式
tm
则“tm equal Tomorrow Moon
”和“Tomorrow Moon equal tm
”都可以匹配。
元字符
除了前面介绍的元字符“^
”和“$
”外,正则表达式里还有更多的元字符,例如下面的正则表达式中就应用了元字符“\b
”和“\w
”。
\blz\w*\b
上面的正则表达式用于匹配以字母lz
开头的单词,先从某个单词开始处(\b
),然后匹配字母lz
,接着是任意数量的字母或数字 (\w*
),最后单词结束处(\b
)。该表达式可以匹配“lzsoft
”“\nlz
”和“lz123456
”等,但不能与“alz
”匹配。
限定符
如果想匹配特定数量的数字,可以限定符(指定数量的字符)来实现该功能。如匹配8
位QQ
号可用如下表达式:
^\d{8}$
字符类
正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如“\d
”“\w
”),但是如果要匹配没有预定义元字符的字符集合(比如元音字母 a, e, i, o, u
),应该怎么办?
只需要在方括号里列出它们就行了,像[aeiou]
可以匹配任何一个英文元音字母,[.?!]
匹配标点符号(“.”“?”或“!”)
。也可以轻松地指定一个字符范围,像“[0-9]
”代表的含义与“\d
”就是完全一致的:一位数字;同理,“[a-z0-9A-Z_]
”完全等同于“\w
”(如果只考虑英文的话)。
要想匹配给定字符串中任意一个汉字,可以使用“[\u4e00-\u9fa5]
”;如果要匹配连续多个汉字,可以使用“[\u4e00-\u9fa5]+
”。
排除字符
匹配不符合指定字符集合的字符串。正则表达式提供了“^
”字符。这个元字符在行定位符中出现过,表示行的开始。而这里将会放到方括号中,表示排除的意思。
[^a-zA-Z]
该表达式用于匹配一个不是字母的字符。
选择字符
包含着条件选择的逻辑,这就需要使用选择字符(|
)来实现。该字符可以理解为“或”,匹配18
位身份证的表达式可以写成如下方式:
(^\d{18}$)|(^\d{17})(\d|X|x)$
该表达式的意思是以匹配18位数字,或者17位数字和最后一位。最后一位可以是数字,也可以是X或者x。
转义字符
正则表达式中的转义字符(\
)和Python中的大同小异,都是将特殊字符(如“.
”“?
”“\
”等)变为普通的字符。举一个IP
地址的实例,用正则表达式匹配诸如“127.0.0.1
”格式的IP
地址。如果直接使用点字符,格式为:
[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是127.0.0.1
这样的IP,连127101011
这样的字符串也会被匹配出来。所以在使用“.
”时,需要使用转义字符(\
)。修改后上面的正则表达式格式为:
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
括号在正则表达式中也算是一个元字符。
分组
小括号字符的第一个作用就是可以改变限定符的作用范围,如“|
”“*
”“^
”等。
(six|four)th
小括号的第二个作用是分组,也就是子表达式。如(\.[0-9]{1,3}){3}
,就是对分组(\.[0-9]{1,3})
进行重复操作。
在Python中使用正则表达式语法
在Python
中使用正则表达式时,是将其作为模式字符串使用的。例如,将匹配不是字母的一个字符的正则表达式表示为模式字符串,可以使用下面的代码:
'[^a-zA-Z]'
而如果将匹配以字母m
开头的单词的正则表达式转换为模式字符串,则不能直接在其两侧添加引号定界符,例如,下面的代码是不正确的。
'\bm\w*\b'
而是需要将其中的“\
”进行转义,转换后的结果为:
'\\bm\\w*\\b'
由于模式字符串中可能包括大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r
或R
。
r'\bm\w*\b'