Python正则表达式
Python正则表达式
Python正则表达式有一个模块“re”,首先,在我们使用正则表达式的时候需要导入这个模块:
import re
分三个部分来介绍Python正则表达式:
- 元字符
- 预定义字符
- 常用功能函数
一、常用字符(元字符)
注:python正则表达式元字符共11个,如下所示:
. |
\ |
* |
+ |
? |
^ |
$ |
| |
{} |
[] |
() |
下面将一一介绍:
(1)"."
功能:用于匹配任意(除\n)外的字符
如上,“.”能够匹配任意字符。
注:search是常用的功能函数,将在第三部分介绍,这里只需要知道其第一个参数是模式,第二个参数是待匹配的字符串,返回结果是 match object对象。group是match object对象的方法。
即在字符串(第二个参数)中寻找能够匹配的模式(第一个参数)
(2)“\”
功能:转义字符,使后一个字符变为字面意思(取消元字符的特殊化)
如上实例可见,元字符“.”不再具有特殊意义,而仅仅是一个字面值(字符.)
(3)"*"
功能:匹配前一个字符0次或多次(贪婪匹配)
如上实例可见“*”前的字符b被匹配了3次
(4)“+”
功能:匹配前一个字符1次或无限次
如上实例可见“+”前的字符n被匹配了4次
(5)“?”
功能:匹配前一个字符0次或1次
如上实例分别展示了匹配“?”前的字符一次和零次。
注:具体是零次还是一次是根据字符串中遇到的模式来定的
(6)“^”
功能:匹配字符串的开头(仅仅匹配开头),多行模式中匹配每一行的开头
- 注:提前了解(之所以说提前了解是因为后面会在第三部分详细介绍)匹配失败之所以会报如上实例的错误的原因:
因为search函数完成正则表达式的模式匹配,如果成功返回match object对象,如果失败返回None。而group是match object对象的方法,None对象没有这个方法所以报错。
另:从如上实例的第二句也能够发现,纵使字符串的其他部分(非开头部分)有指定的模式(比如字符串的最末尾有abc),也不会再去匹配(因为^仅仅匹配开头)。
(7)“$”
功能:匹配字符串的结尾(仅仅匹配结尾),多行模式中匹配每一行的结尾
如上实例,用“^”来理解“$”就非常清楚了。
(8)“|”
功能:匹配左右表达式任意一个
如上实例,“|”好比编程语言中的“或”
(9)“{}”
功能:{m},即匹配前一个字符m次。{m,n},即匹配前一个字符m至n次。
如上实例,“{}”中一旦指定了次数,那就一定在指定次数的范围内
(10)“[]”
功能:字符集,对应的位置可以是字符集中的任意字符(注意是任意一个,从下面实例可发现),可逐个列出([abc]),也可以指定范围([a-c])
如上实例只是简单的应用字符集,字符集的作用非常大。
(11)“()”
功能:将表达式分组
如上实例,第一条有括号那么“a|k”为一个小组,即先匹配sdk然后再匹配a和k中的任意一个。
第二条没有括号那么就是要么匹配sdka要么匹配k了
可见()的功能很简单也很有用,能够实现复杂的正则表达式
二、预定义字符
\d |
\D |
\s |
\S |
\w |
\W |
\A |
\Z |
\b |
\B |
下面一一介绍:
(1)“\d”
功能:匹配数字,即匹配[0-9]
如上实例,\d的作用就类似于之前讲的[0-9],即,匹配任意一个数字
(2)“\D”
功能:匹配非数字,即[^\d]
如上实例,将d大写就好比取反(下面也有很多这种情况),\D为匹配一个非数字
(3)“\s”
功能:匹配任何空白字符[空格,\t,\n,\r,\f,\v]
注:回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))
如上实例,\s匹配了一个空格符
(4)“\S”
功能:匹配任何非空把你字符(刚好与\s相反)
如上实例,\S实现的功能与\s正好相反。且\S匹配的任何非空白字符包括除了[空格,\t,\n,\r,\f,\v]的一切。
(5)“\w”
功能:匹配包括下划线在内的字符
如上实例,\w能够匹配数字、字母、下划线(三者为python标识符的组成)但不能匹配特殊字符
(6)“\W”
功能:匹配特殊字符(与\w刚好相反)
如上实例,\W匹配的是特殊字符(非标识符),与\w刚好相反
(7)"\A"
功能:仅匹配字符串开头(同之前将的元字符^类似)
如上实例,根据元字符^来理解便可
(8)“\Z”
功能:仅匹配字符串结尾(同之前的元字符$类似)
如上实例,根据元字符$来理解便可
(9)“\b”
功能:匹配单词的边界(即,单词和非单词之间的位置),可左可右
如上实例,第一条语句竟然出现匹配错误,出乎意料。其实,对比三条语句发现后两条的模式参数前加了“r”
这是python比较尴尬的地方,因为如果不加“r”,字符串可能把其中的\b视为转义字符(回退),所以造成了匹配效果出乎意料。
加上“r”让\失去转义的意思。所以建议写正则表达式时在模式参数前面都加上"r"
另,\b能够很方便的分离单词。
(10)“\B”
功能:匹配单词的内部,即[^\b]
如上实例,根据\b来理解\B已经很清晰了
三、常用功能函数
compile |
match |
search |
findall |
finditer |
split |
sub |
subn |
相面将对这些常用功能函数做一一介绍:
(1)“compile()”
功能:编译正则表达式模式,返回一个对象模式。
语法:
re.compile(pattern,flags=0)
参数:pattern为指定的模式,flags为一个标志位(默认为零)
注:flags可取的值如下所示:
re.I |
re.M |
re.S |
re.X |
IGNORECASE, 忽略大小写的匹配模式
|
MULTILINE,多行模式, 改变^和$的行为
|
DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符,也就是默认是不能匹配换行符
|
VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释
|
如上实例可见,利用compile将正则表达式编译好后,调用search进行匹配只需指定字符串便可
(2)“match()”
功能:决定是否在字符串刚开始的位置进行匹配。
语法:
re.match(pattern,string,flags=0)
参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)
返回类型:匹配成功返回match object对象,匹配失败返回None对象
注:由于match匹配成功返回match object对象,现介绍match object对象的一些常用方法:
- group():返回被re匹配的字符串
- groups():返回一个包含所有小组字符串的元组
- start():返回匹配字符串开始的位置
- end():返回匹配字符串结束的位置
- span():返回一个元组,还元组由匹配字符串开始和结束的位置组成,即(开始位,结束位)注意,左闭右开
(3)“search()”
功能:在字符串中查找匹配模式,只要找到就第一个返回(match object对象),如未找到就返回None对象。
语法:
re.search(pattern,string,flags=0)
参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)
返回类型:匹配成功返回match object对象,匹配失败返回None对象
可见,之前已经用了太多的search方法来完成匹配:
可见span返回的是(2,4),即左闭右开,字符串的开始时2,而结束不包括4
(4)“findall()”
功能:遍历匹配,获取字符串中所有匹配成功的子字符串,返回一个列表。
语法:
re.findall(pattern,string,flags=0)
参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)
返回类型:匹配成功的字符串组成的列表
如上实例可见,模式为[a-z]+,即所有为a-z(小写字母)组成的单词,从匹配结果也可以发现空格和“!”没有匹配,大写字母C也没有进行匹配。
(5)“finditer()”
功能:搜索string,返回一个顺序访问每个匹配结果的迭代器。
语法:
re.finditer(pattern,string,flags=0)
参数:pattern为指定的模式,string为待匹配的字符串,flags为一个标志位(默认为零)
返回类型:一个迭代器对象,迭代器中的每个元素均是match object类的实例对象
如上实例可见,finditer不仅返回匹配成功的字符串的结果,也能够返回起始、结束下标等
(6)“split()”
功能:分割字符串。
语法:
re.split(pattern,string[,maxspilt])
参数:pattern为指定的分割符,string为待分割的字符串,可选参数,maxsplit为最大分割次数(即最多只准将string切maxsplit刀)
返回类型:一个列表,列表中的元素是被分割后的字符串,即List[String]
(7)“sub()”
功能:替换字符串中的每个子串。
语法:
re.sub(pattern,repl,string,count)
参数:pattern为模式,repel为替换的内容,string待匹配的字符串,count默认为0,为替换个数(即,先用模式去匹配字符串,然后repl将匹配到的东西取代)
返回类型:返回替换后的字符串
(8)“subn()”
功能:替换字符串中的每个子串。
语法:
re.subn(pattern,repl,string,count)
参数:pattern为模式,repel为替换的内容,string待匹配的字符串,count默认为0,为替换个数(即,先用模式去匹配字符串,然后repl将匹配到的东西取代)
返回类型:返回替换后的字符串与替换次数组成的元组,即(替换后的字符串,替换次数)