您的位置:首页 > 编程语言 > Python开发

Python-re正则表达式语法总结(1)和邮箱正则表达式例子

2019-03-30 18:49 309 查看

本次我们讲讲re正则表达式。那讲到re正则表达式的话,难免就需要跟其他的解析库做下对比。如下表

lxml库、正则表达式和BeautifulSoup库对比

工具 解析速度 难度
BeautifulSoup4 最慢 最简单
lxml 简单
正则表达式 最快

大家可以了解一下大概情况。我对这表的理解是,lxml库速度快有部分原因是因为c语言编写的,而BeautifulSoup4库是第三方库,慢也可以理解,毕竟三种方式它的难度是最低的。re正则表达式呢,有多难呢:正则表达式可能你刚写完,出去吃个饭回来,有可能你就要斟酌斟酌自己刚刚为何这样写这式子。。。(雾)

re正则表达式语法总结

表达式 语法
. (点号) 匹配任意字符(除了换行符\n)
\d 匹配任意数字
\D 匹配任意非数字
\s 匹配空白字符(\n,\t,\r,空格)
\w 匹配a-z,A-Z,数字和下划线
\W 跟\w相反
[] 匹配括号中满足的字符

——————————————分割线——————————————

表达式 语法
* 表示0或多个
+ 表示1或多个
? 表示1或0个
{m} 匹配m个字符
{m,n} 匹配m~n个字符

小例子

实践出真知。总结这么多语法不如实际操作一番。
那么我们来写一个邮箱的正则表达式吧——
我们先顺便写一个邮箱 Test_12580@gmail.com
分析一下邮箱的组成,主要是三块内容。
用百度的总结就是:

登录名@主机名.域名

登录名

登录名的构成是大小写字母、数字和下划线,可能还有 -(横杆)
那结合我们上表的语法,登录名可以写成这样

[a-zA-Z0-9_-]+

[]括号中的字符只要满足就可以匹配,不过有一点要注意,
+
号很重要,如果不加
+
号,
[a-zA-Z0-9_-]
匹配的内容就是一个一个单个的字符。+号表示满足[]内容的有1个或多个,就能将Test_12580整整齐齐的拿下来。
不加+号就会——Test_12580
[a-zA-Z0-9_-]
匹配后是
T
e
s
。。。这样一个一个字符。

当然匹配的规则很多样,登录名也可以写成这样[\w-]+

主机名

主机名一般是英文和数字,例如gmail,qq,sina,163
↑(我在思考主机名的时候一直在思索到底有没有带_和-的主机名,我们就认为没有吧,也好更上面的登录名做区分)

要提一点的是:\w表示a-z,A-Z,数字和下划线,那么能不能用在这里呢?
因为我们假设没有自带-和_的主机名,因此我们就不能用**\w**。
那么我们就老实规矩的写一下,

[a-zA-Z0-9]+
这个跟登录名的区别就是少了_和-

.域名

不要看少了,我们这一块把域名前面的

.
(点号)也加进来算一个整体。当然啦,
.
(点号)也可以单独的拿出来还是那句

正则表达式的匹配规则还多样,还少有绝对的表达式

我们直接将.域名的正则表达式贴出来——

(\.[a-zA-Z0-9]+)

这里面有几点需要详细说一下,

.
(点号)前面的
\
是叫转义字符
我们上面的表格写到
.
表示匹配任意的字符(除了换行符),不过,在
.
前加上
\
,那
\.
就不是匹配任意字符,
\.
等于
.

还有大家需要看清楚括号的不同,
\.
[a-zA-Z0-9]+
前面就保证了 .com
.
必须位于
com
的前面。而且不能将
\.
放到
[a-zA-Z0-9]+
里面,后果就变成了满足
a-z
A-Z
0-9
\
,
.
, 都会匹配出来。

邮箱的正则表达式成品就是
[a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)

看起来很长,但是将每一块内容拆分来写的话,还是比较好对付的。

另外我推荐一个网址,大家可以去里面自己尝试写一下正则表达式,例如匹配qq号或电话号码之类的

http://tool.oschina.net/regex/?optionGlobl=global

知识点补充

在上文我们讲到了转义字符

\
\.
表示
.
,实则还有其他方法防止字符转义。
例如我们需要匹配的字符串中出现了’\n’ ,那我们不想让\n转义成换行符的话,我们可以在字符串前加
r
——'r’是防止字符转义的。

↑在用re正则表达式爬虫的时候,
r
的用法很常用也很实用。

总结

好像没什么总结,我们下次再会~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: