电话号码正则表达式语法(python正则表达式详解)
通过前面的学习,我们知道了调用requests库可以爬取html页面,调用beautiful soup库可以解析html页面。但是通常一个html页面拥有非常多的信息,你总不能全部拿过来再手动修改吧,所以就需要使用re正则表达式来提取页面的关键信息。
正则表达式是什么?
re:regular expression,可以简洁、优雅的表达一组字符串的表达式。
举个例子:
"py"
"pyt"
"pyth"
"pytho"
"python"
以上这组字符串有什么相似之处呢?没错,就是它们都是以”py”开头的。
我们用了五行才把所有的字符串枚举一遍,如果换成使用re呢?一行ok!
py(t|th|tho|thon)?n
这只是五行字符串,如果是成千上万行呢?那正则表达式用起来岂不是特别的爽。
“一行胜千言” — 正则表达式
正则表达式最最本质的特征就是:简洁、优雅、一行胜千言。
在我看来,就像是跟苹果logo似的,极简之美环绕其周。
还有一个词:求同存异。
下面来看看正则表达式的语法:
正如上面所展示的,正则表达式由字符和操作符构成。
常用操作符
来看一些经典的正则表达式例子:
^[a-za-z]+$ 由26个字母组成的字符串
^-?d+$ 整数形式的字符串
[1-9]d{5} 中国境内邮政编码
d{3}-d{8}|d{4}-d{7} 国内电话号码
python中的re库
python为正则表达式提供了标准库re,用于匹配字符串。
调用re库:
import re
正则表达式的表示类型:
- re库采用raw string类型表示正则表达式,形式为:r’text’。
例如:r'[1-9]d[5]’
raw string 类型是原生字符串类型,不能对转义字符进行再次转义。
- re库还可以采用string类型表示正则表达式,更为繁琐,形式为’text’。
例如:'[1-9]\d{5}’
前一个”是转义字符。
当正则表达式包含转义字符时,更推荐使用raw string类型。
re库的基本方法:
先来介绍一下match对象:
match对象是一次匹配的结果,包含很多的匹配信息。
和response对象一样,match对象也有一些属性和方法。
match对象的属性
match对象的方法
前面已经介绍过如何调用对象的属性和方法了,这里就不再赘述,可以百度做深入了解。
re库的六个基本方法
下面着重讲解一下search方法:
re.search(pattern, string, flags=0)
在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象。
- pattern:正则表达式的字符串或者原生字符串表示
- string:带匹配的字符串
- flags:正则表达式使用时的控制标记
flags标记取值
# 使用search方法匹配字符串
match = re.search(r'[1-9]d{5}', 'a100001', flags=re.i)
# 匹配成功则返回匹配后的字符串
if match:
print(match.group(0))
注意:match对象返回匹配结果,所以说match返回值是bool型变量,故用条件语句判断。
re库的方法使用起来并没有太大的难度,下面给出剩余方法总结:
re.match(pattern, string, flags=0)
从一个字符串的开始位置起匹配正则表达式,返回match对象。
参数同上。
re.findall(pattern, string, flags=0)
搜索字符串,以列表类型返回全部能匹配的子串。
参数同上。
re.split(pattern, string, maxsplit=0, flags=0)
将一个字符串按照正则表达式匹配结果进行分割,返回列表类型。
- maxsplit:最大分割数,剩余部分作为最后一个元素输出
re.finditer(pattern, string, flags=0)
搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素都是match对象。
参数同上。
for m in re.finditer(r'[1-9]d{5}', 'a100001 b100002'):
if m:
print(m.group(0))
re.sub(pattern, repl, string, count=0, flags=0)
在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串。
- repl:替换匹配字符串的字符串
- count:匹配的最大替换次数
sub = re.sub(r'[1-9]d{5}', ',hello', 'a100001 b100002')
print(sub)
re库的等价用法
上面讲解了re库六种基本方法的函数式用法,下面介绍另一种等价的面向对象的用法:
match = re.search(r'[1-9]d{5}', 'a100001')
cmp = re.compile(r'[1-9]d{5}')
match = cmp.search('a100001')
第一种是函数式用法,一次操作可以完成任务;第二种是面向对象用法,先将正则表达式的字符串形式编译成正则表达式对象,再进行方法操作。两种方法都是可以的,了解即可。
re库的贪婪匹配机制
在实际使用过程中,我们会遇上一个问题,如下:
match = re.search(r'py.*n', 'pyanbncn')
对这样一个字符串,原则上是可以返回三个子串,即’pyan’,’pyanbn’,’pyanbncn’。但是我们调用match.group(0)查看时,该返回哪一个呢?
re库默认采用贪婪匹配机制,返回匹配中最长的子串,也就是返回’pyanbncn’了。
那又有一个问题了,当我们想要输出最短的子串该怎么办呢??
我们只需在操作符后面添加?即可输出最小匹配了:
最小匹配
match = re.search(r'py.*?n', 'pyanbncn')
if match:
print(match.group(0))
小结
本章讲解了python中正则表达式re库的入门级使用,正则表达式并不是python所独有的,很多地方都可以使用,在学习完re库后对其他语言和任务也都有一定的帮助。
推荐阅读
-
python的正则表达式匹配(python正则表达式使用实例)
-
python3正则表达式详解(python中的正则表达式用法)
-
python正则表达式语法大全(正则表达式语法大全)
-
python常用的正则表达式大全
-
电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) 博客分类: 正则表达式 正则表达式
-
js 验证电话号码手机号码正则表达式 博客分类: 正则表达式 正则表达式phone
-
电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) 博客分类: 正则表达式 正则表达式
-
js 验证电话号码手机号码正则表达式 博客分类: 正则表达式 正则表达式phone
-
python中常用的正则表达式及re模块函数的总结
-
正则表达式语法 博客分类: java 正则表达式