Python的字符串处理Re模块

目录

前言

一、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模块进行此类问题的处理。

一、re模块简介

正则表达式(Regular Expression)是按照一定的规则组成的一种字符串的pattern 表达式,我们可以利用正则表达式来进行字符串的匹配,查找以及替换等各种操作。而re模块就是针对正则表达式进行处理的模块,这点从正则表达式的简写和re模块的名称就可以看出来。

二、正则表达式

1.转义字符

在正则表达式中用反斜杠\加特定字母来转换字符本身的含义,此时该字符并不会去匹配它自身,而是去匹配特定的一类字符,如\d不会匹配字母d,而是去匹配数字。常见的转义字符如下表:

转义字符描述
\s匹配间隔符,空格或者Tab键,等价[ \t\t\n\f\v]
\S匹配非间隔符
\d匹配数字,和[0-9]一样
\D匹配非数字
\w匹配字母,数字,等价于[a-zA-z0-9]
\W匹配非字母数字
\b     匹配单词(字母和数字构成的字符串)的边界
\B  匹配非单词的边界

2.元字符

大部分的字符可以匹配自身,但是元字符是例外,正则表达式赋予它们别的含义。常见元字符列表如下:

元字符描述
.匹配除了换行符外的任意字符
*重复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)匹配括号内的表达式,同时捕捉匹配到的表达式到分组中

3.位置引用

当需要匹配字符串的特定位置时,可以用到一些位置匹配的字符,如下表

字符描述
^匹配字符串起始位置,注意在[]中含义不同
$匹配字符串结束位置
$A匹配字符串起始位置
$Z匹配字符串结束位置
\b匹配单词边界
\B匹配非单词边界

4.匹配分组

        我们可以通过小括号(exp)来匹配表达式的内容到一个分组中,并用\num来引用该分组的内容。

字符描述
(exp)(abc)匹配abc并将其匹配结果分配到分组中
(?P<name>exp)更改分组的名称
(?P=name)分组的引用
(?#exp)注释为exp,匹配时忽略括号的内容
\num默认的分组的引用,如\1表达第1个括号的分组信息

三、Re模块常用方法

1. re.match()

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 object; span=(0, 3), match='abc'>
>>> re.match('ABC',s) #匹配字符串s的开头为'ABC',匹配失败,返回none
>>> re.match('ABC',s,re.I) #匹配字符串s的开头为'ABC',不区分大小写,匹配成功
<re.Match object; span=(0, 3), match='abc'>

2.re.search()

re.match()只能匹配字符串的开头,想要在任意位置匹配,则可以用re.seach()。re.search()会从头到尾去匹配字符串,匹配成功返回第1次匹配的结果,匹配失败则返回None。用法如下:

re.search(pattern,string,flags=0)

下面举个例子说明:

>>> s='abc123abc'
>>> re.search('123',s) #用re.search(),匹配成功返回匹配的对象
<re.Match object; span=(3, 6), match='123'>
>>> re.match('123',s) #用re.match(),匹配失败
>>> re.search('\d+',s)  #匹配数字       
<re.Match object; span=(3, 6), match='123'>
>>> re.search('\d+',s).group() #group()返回匹配的字符
'123'
>>> re.search('\d+',s).span()  #span()返回匹配的字符的下标
(3, 6)

3.re.findall()

re.findall()会对字符串进行多次匹配,返回匹配的列表,如果匹配失败则返回空列表。用法为:

re.findall(pattern,string,flags=0)

举例如下:

>>> s='12abc345def123gh12'   
>>> re.findall('\d+',s) #匹配成功,返回匹配的列表
['12', '345', '123', '12']
>>> re.findall('1234',s) #匹配失败,返回空列表
[]

4.re.sub()

re.sub()可以将字符串中的pattern替换成给定字符,如果匹配成功则将匹配pattern替换掉并返回新的字符串,如果匹配失败则返回原字符串。其用法为:

re.sub(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'

5.re.split()

re.split()可以将字符串根据分隔符进行分割,并返回分割后的列表,用法如下:

re.split(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']

6.re.compile()

re.compile()将1个pattern编译成1个对象,并可以赋值给1个变量,这样可以省去每次写pattern的时间,用法为:

re.compile(pattern,flags=0)

举例如下:

>>> s='abc123def'  
>>> pattern=re.compile('[a-z]+\d+')
>>> re.match(pattern,s)
<re.Match object; span=(0, 6), match='abc123'>

7.匹配标志

re模块常用的匹配标志如下表所示:

标志描述
re.I不区分大小写
re.M多行匹配,影响^和$,同时匹配字符串首尾以及行的首尾
re.S'.'匹配所有字符包括换行符
re.L做本地化识别匹配,影响\w,\W,\b,\B
re.U根据Unicode字符集解析字符
re.X用更灵活方式解析正则表达式

总结

以上就是本文分享的re模块以及正则表达式的相关信息和用法,正则表达式是非常强大的字符串处理工具,也是学习脚本语言的基础必备技能。如果本文分享的信息能够帮助到大家,希望多多点赞收藏。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值