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

本次我们讲讲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个字符

小例子

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

登录名@主机名.域名

登录名

登录名的构成是大小写字母、数字和下划线,可能还有 -(横杆)
那结合我们上表的语法,登录名可以写成这样[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-zA-Z0-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’是防止字符转义的。
Python-re正则表达式语法总结(1)和邮箱正则表达式例子_第1张图片
↑在用re正则表达式爬虫的时候,r的用法很常用也很实用。

总结

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

你可能感兴趣的:(Python)