目录
前言
一、re模块简介
二、正则表达式
1.转义字符
2.元字符
3.位置引用
4.匹配分组
三、Re模块常用方法
1. re.match()
2.re.search()
3.re.findall()
4.re.sub()
5.re.split()
6.re.compile()
7.匹配标志
总结
前言
Python有自己的字符串的方法和函数,可以很方便地进行字符串的一些处理。不过当需要利用正则表达式进行字符串处理的时候,Python自带的方法和函数就不太够用了,这时我们可以利用re模块进行此类问题的处理。
正则表达式(Regular Expression)是按照一定的规则组成的一种字符串的pattern 表达式,我们可以利用正则表达式来进行字符串的匹配,查找以及替换等各种操作。而re模块就是针对正则表达式进行处理的模块,这点从正则表达式的简写和re模块的名称就可以看出来。
在正则表达式中用反斜杠\加特定字母来转换字符本身的含义,此时该字符并不会去匹配它自身,而是去匹配特定的一类字符,如\d不会匹配字母d,而是去匹配数字。常见的转义字符如下表:
转义字符 | 描述 |
\s | 匹配间隔符,空格或者Tab键,等价[ \t\t\n\f\v] |
\S | 匹配非间隔符 |
\d | 匹配数字,和[0-9]一样 |
\D | 匹配非数字 |
\w | 匹配字母,数字,等价于[a-zA-z0-9] |
\W | 匹配非字母数字 |
\b | 匹配单词(字母和数字构成的字符串)的边界 |
\B | 匹配非单词的边界 |
大部分的字符可以匹配自身,但是元字符是例外,正则表达式赋予它们别的含义。常见元字符列表如下:
元字符 | 描述 |
. | 匹配除了换行符外的任意字符 |
* | 重复0次及以上 |
+ | 重复1次及以上 |
? | 重复0次或者1次,或者非贪婪匹配使能 |
\ | 转义字符 |
^ | 匹配开头位置 |
$ | 匹配结束位置 |
| | 在[]外表示左右两边字符的或,如aa|bb 表示匹配aa或者bb |
{exp} | {n}:重复n次;{n,}:重复n次及以上;{n,m}:重复n到m次 |
[exp] | 匹配中括号内的任意字符,如[abc]匹配a,b或者c |
[^exp] | 不匹配中括号内的任意字符,如[^abc]不匹配a,b和c,主要^代表补集 |
(exp) | 匹配括号内的表达式,同时捕捉匹配到的表达式到分组中 |
当需要匹配字符串的特定位置时,可以用到一些位置匹配的字符,如下表
字符 | 描述 |
^ | 匹配字符串起始位置,注意在[]中含义不同 |
$ | 匹配字符串结束位置 |
$A | 匹配字符串起始位置 |
$Z | 匹配字符串结束位置 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
我们可以通过小括号(exp)来匹配表达式的内容到一个分组中,并用\num来引用该分组的内容。
字符 | 描述 |
(exp) | (abc)匹配abc并将其匹配结果分配到分组中 |
(?P |
更改分组的名称 |
(?P=name) | 分组的引用 |
(?#exp) | 注释为exp,匹配时忽略括号的内容 |
\num | 默认的分组的引用,如\1表达第1个括号的分组信息 |
re.match()方法可以匹配字符串的起始位置,匹配成功则返回符合规则的对象,匹配失败则返回None。其用法为:
re.match(pattern,string,flags=0)
其中参数定义如下
pattern:正则表达式
string:为要匹配的字符串
flag:为可选标志位,如是否区分大小写re.I,是否多行匹配re.M等
举例如下:
>>> s='abc123abc'
>>> re.match('abc',s) #匹配字符串s的开头为'abc',匹配成功返回match数据
>>> re.match('ABC',s) #匹配字符串s的开头为'ABC',匹配失败,返回none
>>> re.match('ABC',s,re.I) #匹配字符串s的开头为'ABC',不区分大小写,匹配成功
re.match()只能匹配字符串的开头,想要在任意位置匹配,则可以用re.seach()。re.search()会从头到尾去匹配字符串,匹配成功返回第1次匹配的结果,匹配失败则返回None。用法如下:
re.search(pattern,string,flags=0)
下面举个例子说明:
>>> s='abc123abc'
>>> re.search('123',s) #用re.search(),匹配成功返回匹配的对象
>>> re.match('123',s) #用re.match(),匹配失败
>>> re.search('\d+',s) #匹配数字
>>> re.search('\d+',s).group() #group()返回匹配的字符
'123'
>>> re.search('\d+',s).span() #span()返回匹配的字符的下标
(3, 6)
re.findall()会对字符串进行多次匹配,返回匹配的列表,如果匹配失败则返回空列表。用法为:
re.findall(pattern,string,flags=0)
举例如下:
>>> s='12abc345def123gh12'
>>> re.findall('\d+',s) #匹配成功,返回匹配的列表
['12', '345', '123', '12']
>>> re.findall('1234',s) #匹配失败,返回空列表
[]
re.sub()可以将字符串中的pattern替换成给定字符,如果匹配成功则将匹配pattern替换掉并返回新的字符串,如果匹配失败则返回原字符串。其用法为:
re.match(pattern,repl,string,count=0,flags=0)
其中参数定义如下
pattern:正则表达式
repl:替换字符串
string:匹配对象
count: 可选参数,最大替换次数,默认为0表示全部匹配都替换
flag:为可选标志位,如是否区分大小写re.I,是否多行匹配re.M等
举例如下:
>>> s='abc123abc'
>>> re.sub('\d+','abc',s) #匹配数字并替换为'abc'
'abcabcabc'
>>> re.sub('[^0-9]+','123',s) #匹配非数字并替换为'123'
'123123123'
>>> re.sub('abcd','123',s) #匹配失败,返回原字符串
'abc123abc'
re.split()可以将字符串根据分隔符进行分割,并返回分割后的列表,用法如下:
re.match(pattern,string,count=0,maxsplit=0)
其中参数定义如下
pattern:正则表达式
string:匹配对象
maxsplit: 可选参数,最大分割次数,为0表示尽可能全部分割
举例如下:
>>> s='abc123def456ghi'
>>> re.split('123',s) #用字符串'123'进行分割
['abc', 'def456ghi']
>>> re.split('1234',s) #用字符串'123'进行分割,匹配失败返回原字符串的列表
['abc123def456ghi']
>>> re.split('\d+',s) #用数字进行分割
['abc', 'def', 'ghi']
>>> re.split('\d+',s,maxsplit=1) #用数字进行分割,最大分割一次
['abc', 'def456ghi']
re.compile()将1个pattern编译成1个对象,并可以赋值给1个变量,这样可以省去每次写pattern的时间,用法为:
re.match(pattern,flags=0)
举例如下:
>>> s='abc123def'
>>> pattern=re.compile('[a-z]+\d+')
>>> re.match(pattern,s)
re模块常用的匹配标志如下表所示:
标志 | 描述 |
re.I | 不区分大小写 |
re.M | 多行匹配,影响^和$,同时匹配字符串首尾以及行的首尾 |
re.S | '.'匹配所有字符包括换行符 |
re.L | 做本地化识别匹配,影响\w,\W,\b,\B |
re.U | 根据Unicode字符集解析字符 |
re.X | 用更灵活方式解析正则表达式 |
以上就是本文分享的re模块以及正则表达式的相关信息和用法,正则表达式是非常强大的字符串处理工具,也是学习脚本语言的基础必备技能。如果本文分享的信息能够帮助到大家,希望多多点赞收藏。