前言
字符串是编程中非常常用的数据结构,对它的操作处理也非常重要。所以学透本知识点,对以后开发过程中对字符串处理,特别是爬虫、对用户输入数据的校验等非常重要。
对于之前从未接触编程的同学来说,"正则表达式"这个名字或许不那么见名知义,总之一看这个名字就让人感觉不太好理解。其实,正则表达式它还有另外一个名字:规则表达式,个人觉得这个"规则表达式"反而更容易被理解。
正则表达式,也即规则表达式,说白了就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对字符串的一种过滤逻辑。
常见的场景:对邮箱格式的校验、对手机号的合法性校验、爬虫中核心数据的获取...
Python 自1.5版本起增加了模块, 模块使 Python 语言拥有全部的正则表达式功能。
函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串, 即形参:,来做为它们的第一个参数。
正则表达式的思想
正则表达式的设计思想是:用一种描述性的语言来定义一个规则,凡是符合此规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
我们要学习的就是如何定义这个"规则"。
示例及说明
因为正则表达式也是用字符串表示的,所以我们要首先了解如何用字符来描述字符。
精准匹配
在正则表达式中,如果直接给出字符,就是精确匹配。用可以匹配一个数字,可以匹配一个字母或数字,例如:
表示必须是123后跟一位任意数字的,可以匹配:、,但无法匹配
表示必须是123后跟一位任意字母或数字的,可以匹配:、、
表示3个数字,可以匹配:、,但无法匹配、
可以匹配任意字符,例如:
表示必须是abc后跟一位任意字符的,可以匹配:、、, 但无法匹配
不定长匹配
要匹配变长的字符,在正则表达式中:
用表示任意个字符(包括0个),
用表示至少一个字符,
用表示0个或1个字符,
用表示n个字符,
用表示个字符。例如:
上面例子中的可以简写为表示3个数字,可以匹配:、,但无法匹配、;
"bo*k"可以匹配:、、、等,但无法匹配
此处我们先介绍一个函数:
功能:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
语法格式:
参数说明:
:正则中的模式字符串。
:要匹配的字符串。
:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
注意: 后面还会学习另外两个函数,现在你只需知道 和 是匹配一次,而 匹配所有。
上面规则用代码验证如下:
运行结果:
同理,可以验证:
"wo+w"可以匹配:、、等,但无法匹配、等;
"wo?w"可以匹配:、等,但无法匹配、、等;
"wow"可以匹配:,但无法匹配、、、等;
"wow"可以匹配:、、,但无法匹配、、等;
字符集 [ ]
对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如或。
匹配字符串开头,表示必须以数字开头。
匹配字符串行末尾,表示必须以数字结束。
可以匹配或,所以可以匹配或者。
你可能注意到了,也可以匹配,但是加上就变成了整行匹配,就只能匹配了。
语法元素
表示特定含义特殊字符:
re模块
Python 自版本起增加了模块,模块使 Python 语言拥有全部的正则表达式功能。
在设计规则表达式时,要特别注意字符转义。由于Python的字符串本身也用转义,所以要特别注意:
因此我们强烈建议使用Python的前缀,就不用考虑转义的问题了:
re.match(pattern, string, flags)判断匹配
方法尝试从字符串的起始位置去匹配一个模式,判断起始位置是否能匹配,如果匹配成功,返回一个对象,否则返回。
函数语法:
函数参数说明:
【示例】
方法是从起始位置去匹配的。注意区分下面两种匹配结果:
运行结果:
re.split()切分字符串
方法按照能够匹配的子串将字符串分割后返回列表。
函数语法:
函数参数说明:
用正则表达式切分字符串比用固定的字符更灵活,常规切分代码:
打印切分结果:
缺陷是无法用连续的空格去切分,而正则表达式可以灵活切分:
打印切分结果:
如果待分割的字符串中含有了其他字符,要得到,也是可以的:
打印切分结果:
替换re.sub()
Python 的模块提供了用于替换字符串中的匹配项。
语法:
参数说明:
示例如下:
运行结果:
re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
此处参数和其他意义一样,不再赘述。
正则表达式分组功能
除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用表示的就是要提取的分组(Group)。其中,被括起来的正则表达式将作为一个分组。
分别定义了两个组:、,可以直接从匹配的字符串中提取出区号和本地号码:
运行结果:
一旦正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。注意到永远是原始字符串,、……表示第1、2、……个子串。
在上面,当匹配成功时返回一个 对象,其中 对象包含的信息:
方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用或 ;
方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
方法返回 (start(group), end(group))。
贪婪匹配
正则匹配默认是贪婪匹配,也就是每次都是默认去匹配尽可能多的字符。
re.compile() 函数编译正则表达式
当我们在Python中使用正则表达式时,re模块内部会干两件事情:
1.编译正则表达式,如果正则表达式合法,编译后生成对象。如果正则表达式的字符串本身不合法,会报错;
2.用编译后的正则表达式去匹配字符串。
如果一个正则表达式要重复使用成百上千次,则出于效率的考虑,我们可以预编译该正则表达式,接下来重复使用时就不需要编译这个步骤了,直接匹配。
函数用于编译正则表达式,生成一个正则表达式对象,该对象有提供和 这两个函数使用。
语法格式为:
参数:
flags 参数可取的值
re.search方法
扫描整个字符串并返回第一个成功的匹配。
函数语法:
:匹配成功方法返回一个匹配的对象,否则返回None。
re.match与re.search的区别
只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回;而匹配整个字符串,从开始去找,直到找到一个匹配。如果直到结束还没找到匹配的,才返回。
小结
正则表达式,也即规则表达式,说白了就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”来表达对字符串的一种过滤逻辑。
正则表达式的内容非常丰富,我们只是学习了其中最基础、最为常用的知识点,而这些满足日常开发也绰绰有余了。
领取专属 10元无门槛券
私享最新 技术干货