当前位置:

再见,Python正则表达式

访客 2024-01-05 1059 0

人生苦短,快学Python?

正则表达式是我们用于查找、匹配、替换中,很重要的一项技能,但是大多数人总是学不会。

其实主要还是没掌握方法,当你真正掌握方法后,真的要说一句再见,Python正则表达式!

re库

在Python中,re库又叫做正则表达式库,也属于Python标准库之一,不用安装就可以使用。

什么是正则表达式?

正则表达式是一组由字母和符号组成的特殊文本,可以帮助我们从某个复杂的字符串中,提取出满足我们要求的特殊文本。

用一个形象的比喻大致体会一下正则匹配的过程。苹果相当于写的“正则表达式”,字符串相当于“水果市场”,“正则匹配的过程”就相当于拿着苹果去“水果市场”找苹果的过程,每找到一个就返回一个,否则就什么也没有。

常用操作符介绍

正则表达式之所以这么强大,是因为拥有这么多专用操作符。为了方便大家记忆,我特意将操作符分为三类:

  • 第一,元字符;
  • 第二,量化符;
  • 第三,特殊符;

1.常用元字符

所谓“元字符”,指的是那些不仅仅可以表示字符本身含义、并且还可以表示其他特殊含义的字符。

常用的元字符有.[]()^$|\?*{}共11种,为了更清楚地说明每个元字符的含义,我这里整理了一张表格供大家参考。

可以看到,上面一共说明了7种元字符的含义,还有4种并没有说明。那是为了方便大家记忆,我特意将上述最后4个元字符分类到了“量化符”中,这个将在下面一小节中进行讲述。

2.常用量化符

所为“量化符”,指的就是将紧挨着量化符前面的那个字符,匹配0次、1次或者多次,详细说明见下表。

3.常用特殊符

所为“特殊符”,指的就是由转义字符加某些字母组合而成的具有特殊意义的特殊字符,详细说明见下表。

常用方法介绍

在re库中,一共提供了三个函数用于查找匹配,分别是match()search()还有findall(),下面我们分别对他们进行讲述。

1.三大函数含义对比

在这三个函数中,用的最多的是findall()这个函数,其次是search()函数,match()函数则用的很少。下面我们一个一个地说明它的含义:

  • match(pattern,string):匹配字符串的开头,如果开头匹配不上,则返回None
  • seach(pattern,string):扫描整个字符串,匹配后立即返回,不在往后面匹配;
  • findll(pattern,string):扫描整个字符串,以列表形式返回所有的匹配值;

其中,pattern表示用于匹配的正则表达式,string表示待匹配的字符串。

2.三大函数用法对比

前面我们已经介绍了这三个函数的具体含义,现在用一个案例对比说明它们的不同之处。

导入相关库。

importre

如果有如下两个字符串。

s="黄同学喜欢唱歌,黄同学喜欢写作,黄同学喜欢吃火锅!"s1="喜欢唱歌,喜欢写作,喜欢吃火锅"
①使用match()函数

首先我们使用直接匹配s字符串中的“喜欢”二字。

re.match("喜欢",s)

这行代码没有返回结果,表示返回结果是None值,那是由于match()只匹配开头,如果开头不是“喜欢”二字,那么就返回None。

re.match("喜欢",s)==None

返回结果是:True。

如果我们再使用match()函数,匹配s1字符串中的“喜欢”二字。

re.match("喜欢",s1)

返回结果是:<re.Matchobject;span=(0,2),match=‘喜欢’>。

上述结果得到的是一个匹配对象,如果我们想要获取其中的匹配值,就必须调用匹配对象的group()方法,获取具体的匹配值。

re.match("喜欢",s1).group()

返回结果是:’喜欢’

②使用search()函数

接着我们使用直接匹配s字符串中的“喜欢”二字。

re.search("喜欢",s)

返回结果是:<re.Matchobject;span=(3,5),match=‘喜欢’>。

上述结果同样返回的是一个匹配对象,仍然需要调用group()方法,获取到具体的匹配值。

re.search("喜欢",s).group()

返回结果是:‘喜欢’

③使用finall()函数

最后我们再使用直接匹配s字符串中的“喜欢”二字。

re.findall("喜欢",s)

返回结果是:[‘喜欢’,‘喜欢’,‘喜欢’]

3.其他常用方法

除了上述三个用于查找匹配的函数之外,还有用于切分的split()函数,有用于替换的sub()函数。另外还有两个常用修饰符re.I和re.S,简单了解一下。下面我们一个一个地介绍它们的含义:

  • split(pattern,string):按照某个匹配的正则表达式,将整个字符串切分后,以列表返回;
  • sub(pattern,repl,string):按照某个匹配的正则表达式,将整个字符串的某个字串替换为另外一个字串;
  • re.I:让正则表达式自动忽略大小写;
  • re.S:让“.”能够匹配包括换行符在内的任意字符;

其中,pattern表示用于匹配的正则表达式,string表示待匹配的字符串,repl表示替换后的字串。

假如有这样3个字符串:

s="赵1钱2孙4李8周16吴32郑64王128黄"s1="Huang是huang"s2="黄\n同学"
需求1:将字符串s按照数字切分,以一个汉字组成的列表返回。

我们知道\d是匹配某一个数字,但是上述字符串里面,有2位的数字还有3位的数字,于是你会想到使用\d表示匹配>=1个数字,因此整个代码如下:

re.split("\d",s)

返回结果是:[‘赵’,‘钱’,‘孙’,‘李’,‘周’,‘吴’,‘郑’,‘王’,‘黄’]。

需求2:将字符串s中的数字部分,全都替换为空。

同样我们仍然用\d表示匹配>=1个数字,这道题的代码如下:

re.sub("\d","",s)

返回结果是:‘赵钱孙李周吴郑王黄’

需求3:将字符串s1中的h匹配出来,不区分大小写;

如果不加re.I,系统会将它们看待成不同的字符。

re.findall("h",s1)

返回结果是:[‘h’]

如果加了re.I,系统会忽略大小写,那么h和H就是同一个字符。

re.findall("h",s1,re.I)

返回结果是:[‘H’,‘h’]

需求4:将字符串s2整个匹配出来,包括换行符;

如果不加re.S,“.”不能匹配“\n”换行符。

re.findall(".",s2)

返回结果是:[‘黄’,‘同学’]

如果加了re.S,“.”此时能够匹配“\n”换行符。

re.findall(".",s2,re.S)

返回结果是:[‘黄\n同学’]

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~