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将匹配到的东西取代)

返回类型:返回替换后的字符串与替换次数组成的元组,即(替换后的字符串,替换次数)

 


 

posted @ 2018-09-13 21:21  ThisYanOK  阅读(1757)  评论(0编辑  收藏  举报