日拱一卒|数据挖掘010
入门爬虫,学习正则表达式并不是必须的,你可以在你真正需要的时候再去学,比如你把数据爬取回来后,需要对数据进行清洗,当你发现使用常规的字符串操作方法根本没法处理时,这时你可以尝试了解一下正则表达式,往往它能起到事半功倍的效果。Python 的 re 模块可用来处理正则表达式(Python之禅 刘志军)。
一、正则表达式简介
正则表达式是处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎.其是对字符串操作的一种逻辑公式,即用事先定义好的一些特定字符、以及这些字符的组合,组成一个“规则字符串”,用来表达对字符串的一种过滤逻辑。
背景知识:字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等等。字符串是0个或更多个字符的序列。文本也就是文字,字符串。说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件
正则表达式可以:
- 提高网络爬虫的效率
- 提高信息提取的效率
- 提高网页运行的效率
- ...
二、正则表达式用途
比如,正在搜索一个文档,里面包含单词can(不区分大小写),但并不像把包含字符串can其他单词(比如American,cancel等)也找出来。
比如,正在编辑一段代码,需要把其中的size都换成isize,但这种替换需要仅仅限于单词size而不涉及其他包含字符串size的其他单词。
比如,创建了一份包含一张表单的Web页面用来收集用户信息,其中包含一个电子邮箱地址。需要检查用户填写的地址是否符合正确的语法格式。
以上场景,正则表达式都有用武之地。
正则表达式具有搜索、过滤和替换功能。在使用的过程中需要注意:
- 正则表达式主要应用于字符串中
- 字符串编码问题(UTF-8、GB2312、GBK等)
- 正则表达式是区分字符串字符大小写的
三、正则表达式语法
该部分内容参考自:正则表达式完全指南(上)和正则表达式完全指南(下)
正则表达式由普通文本字符和特殊字符(元字符)两种字符组成。元字符在正则表达式中具有特殊意义,它让正则表达式具有更丰富的表达能力。例如,正则表达式 r"a.d"中 ,字符 ‘a’ 和 ‘d’ 是普通字符,’.’ 是元字符,. 可以指代任意字符,它能匹配 ‘a1d’、’a2d’、’acd’ 。
举例说明: 3
如果原文本字符串与正则表达式匹配,那么就会返回一个 Match 对象,当不匹配时,match 方法返回的 None,通过判断m是否为None可进行表单验证。
(一)元字符
1.基本元字符
.
匹配除换行符以外的任意一个字符,例如:”a.c” 可以完全匹配 “abc”,也可以匹配 “abcef” 中的 “abc”
\
转义字符,使特殊字符具有本来的意义,例如: 1.2 可以匹配 1.2
[...]
匹配方括号中的任意一个字符,例如:a[bcd]e 可以匹配 abe、ace、ade。它还支持范围操作,比如:a到z可表示为 “[a-z]”,0到9可表示为 “[0-9]”,注意,在 “[]” 中的特殊字符不再有特殊意义,就是它字面的意义,例如:[.*]就是匹配 . 或者 *
[^...]
字符集取反,表示只要不是括号中出现的字符都可以匹配,例如:a[^bcd]e 可匹配 aee、afe等
group 方法返回原字符串(abcef)中与正则表达式相匹配的那部分子字符串(abc),提前是要匹配成功 match 方法才会返回 Match 对象,进而才有group方法。
2.预设元字符
\w
匹配任意一个单词字符,包括数字和下划线,它等价于 [A-Za-z0-9_],例如 a\wc 可以匹配 abc、acc
\W
匹配任意一个非单词字符,与 \w 操作相反,它等价于 [^A-Za-z0-9_],例如: a\Wc 可匹配 a!c
\s
匹配任意一个空白字符,空格、回车等都是空白字符,例如:a\sc 可以配 a\nc,这里的 \n表示回车
\S
匹配任意一个非空白字符
\d
匹配任意一个数字,它等价于[0-9],例如:a\dc 可匹配 a1c、a2c …
\D
匹配任意一个非数字
(二)匹配
1.边界匹配
^
匹配字符的开头,在字符串的前面,例如:^abc 表示匹配 a开头,后面紧随bc的字符串,它可以匹配 abc
$
匹配字符的结尾,在字符串的末尾位置,例如: hello$
2.重复匹配
*
重复匹配零次或者更多次
?
重复匹配零次或者一次
+
重复匹配1次或者多次
{n}
重复匹配n次
{n,}
重复匹配至少n次
{n,m}
重复匹配n到m次
(三)逻辑分支
匹配一个固定电话号码,不同地区规则不一样,有的地方区号是3位,电话是8位,有的地方区号是4位,电话为7位,区号与号码之间用 - 隔开,如果应对这样的需求呢?这时就需要用到逻辑分支条件字符 |,它把表达式分为左右两部分,先尝试匹配左边部分,如果匹配成功就不再匹配后面部分了,这是逻辑 “或” 的关系。
8(四)分组
前面介绍的匹配规则都是针对单个字符而言的,如果想要重复匹配多个字符怎么办,答案是,用子表达式(也叫分组)来表示,分组用小括号”()”表示,例如 (abc){2} 表示匹配abc两次, 匹配一个IP地址时,可以使用 (\d{1,3}.){3}\d{1,3},因为IP是由4组数组3个点组成的,所有,前面3组数字和3个点可以作为一个分组重复3次,最后一部分是一个1到3个数字组成的字符串。如:192.168.0.1。
关于分组,group 方法可用于提取匹配的字符串分组,默认它会把整个表达式的匹配结果当做第0个分组,就是不带参数的 group() 或者是 group(0),第一组括号中的分组用group(1)获取,以此类推。
9通过分组,我们可以从字符串中提取出想要的信息。另外,分组还可以通过指定名字的方式获取,语法如图12。
10(五)贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。我们称之为贪婪模式,是一种贪得无厌的模式。
11
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
12 13Python中re库放在以后说爬虫相关库的时候再介绍啦
参考资料:
1.正则表达式30分钟入门教程
2.Python爬虫知识点梳理
3.Python正则表达式指南
4.正则表达式完全指南(上)
5.正则表达式完全指南(下)
6.可能是最好的正则表达式的教程笔记了吧
7.re — 正则表达式操作
8.python 3.6 正则表达式的应用(附实例代码)
9.棕榈学院-Python正则表达式公开课
网友评论