1.Python正则表达式匹配文本模式方法
正则表达式是一种快速从文本中匹配对应模式文本的表达式,在Python中所有的正则表达式函数都在模块re中。
其一般使用方法如下:
import re
mo1 = re.compile('Batman') # 先使用re的方法compile,compile的字符串参数便是一个正则表达式
# compile将返回一个一个Regex对象,mo1就是对应正则表达式模式的对象
name1 = mo1.search('My favorite hero is Batman') # 使用mo1对象中search方法,这个方法的字符串参数就是需要被查找的字符串
# 匹配成功,那么将返回一个Match对象给name1,这个对象中有group()方法,它返回与正则表达式匹配的字符串(有些情况不全是字符串,我会在后面作解释)
# 匹配失败,返回None
print(name1.group())
输出结果如下:
2.直接查找模式
2.1直接查找
上面的代码就是直接查找模式,正则表达式字符串是'Batman',则需要在字符串'My favorite hero is Batman',寻找'Batman'
2.2管道匹配多种模式
有时,需要匹配的文本有多种可能,需要不同的正则表达式匹配模式,可以用‘|’这个符号来表示管道匹配,即匹配多种可能
示例如下:
mo2 = re.compile(r'Batman|Superman')
name2 = mo2.search('My favorite hero is Superman')
print(name2.group())
正则表达式是'Batman|Superman',那么在search()的字符串参数中,与之匹配的是'Superman',那么返回的Match对象赋给name2,其方法group()返回’Superman‘
输出结果如下:
2.3管道匹配多种分组模式
如果"我喜欢的英雄可能性有点大",正则表达式需要写成'Batman|Superman|Spiderman'吗?
可以,但可以用简洁的形式'(Bat|Super|Spider)man'
那么我们先看代码:
mo3 = re.compile('(Bat|Super|Spider)man')
name3 = mo3.search('My favorite hero is Spiderman')
print(name3.group())
print(name3.group(0)) # 0默认是整个匹配的字符串
print(name3.group(1)) # 1是匹配的第一个分组
search()进行匹配时,先匹配第一个分组’Bat‘’Super‘’Spider‘中的一个,再匹配’man‘;也可以认为是匹配’Batman‘'Superman''Spiderman'中的一个。
这是运行情况:
需要指出的是,在正则表达式中出现分组时,可以在group中传入参数,参数作为索引,比如在上述代码的group(1),此方法将返回第一个分组,同时,无参数或者参数为0则默认返回整个匹配文本
search()只会返回含有第一个出现的匹配文本的对象
先来看看这段代码:
mo4 = re.compile('(Bat|Super)man')
name4 = mo4.search('I love Superman and Batman')
print(name4.group()) # 只输出第一个出现的Superman
运行结果如下:
这段代码中,可以正则表达式可以匹配的文本有’Superman‘和'Batman'两个,但是name4对象的group方法只返回了第一个出现的'Superman'。
后面会有找到所有匹配文本的方法
3.查找固定类型字符模式
3.1字符类型
缩写字符 | 匹配字符 |
---|---|
\d | 0~9的数字 |
\D | 除了0~9的其它字符 |
\w | 字母,数字,下划线 |
\W | 除了字符数字下划线 |
\s | 空格制表换行符 |
\S | 除了空格制表换行符 |
从上面表格可以看出了,大写字母匹配的字符就是小写字母匹配字符的补集
3.2固定类型模式
使用上面的缩写字符,可以匹配指定类型的字符
如代码:
mo5 = re.compile(r'\d\d\d\d\d\d\d\d\d\d\d')
phone_number1 = mo5.search('我的电话号码是15600000000')
print(phone_number1.group())
r前缀用于表示字符串是一个原始字符串,避免转义。
比如,如果无r前缀,那么字符串中的'\n'将被解释为换行符,但是如果加上r前缀,那么会被解释为''和'n'两个字符。
这在正则表达式使很有效,因为正则表达式是按照两个字符''和'd‘来匹配一个数字型的字符,如果不加前缀r,那么我们需要在正则表达式中这样写'\\d','\'代表'',代码演示如下
mo = re.compile('\\d')
num = mo.search('abcd6ef')
print(num.group())
运行结果如下:
但是需要注意的是,以下几个在正则表达式中有特殊含义的字符即使前面有r,仍然要加转义字符'\'来匹配这些特殊字符
\ | | | + |
---|---|---|
* | ? | ^ |
$ | { | } |
( | ) | . |
[ | ] | </ |