昨天爬取了丁香园的实时更新的动态信息,但是里面有好多对项目无关的信息(如下图),所以就要进行数据的清洗,
想到了python的正则表达式,就对正则表达式进行了学习,现进行如下总结:
首先,python中的正则表达式大致分为以下几部分:
- 元字符
- 模式
- 函数
- re 内置对象用法
- 分组用法
- 环视用法
一、元字符 (个人感觉常用到的)
- . 匹配任意字符(不包括换行符)
- ^ 匹配开始位置,多行模式下匹配每一行的开始
- $ 匹配结束位置,多行模式下匹配每一行的结束
- * 匹配前一个元字符0到多次
- + 匹配前一个元字符1到多次
- ? 匹配前一个元字符0到1次
- {m,n} 匹配前一个元字符m到n次
- \ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\.只能匹配.,不能再匹配任意字符
- [] 字符集,一个字符的集合,可匹配其中任意一个字符
- | 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
- (...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
- d 匹配一个数字, 相当于 [0-9]
- D 匹配非数字,相当于 [^0-9]
- w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
- W 匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]
二、模式(我感觉常用到的)
- I IGNORECASE, 忽略大小写的匹配模式
1 str = 'I Love China!' 2 3 regex = re.compile("i love china!", re.I) 4 print regex.match(str).group() 5 #output> 'I Love China'
- S DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
- X VERBOSE,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式
1 email = re.compile("[w+.]+@[a-zA-Zd]+.(com|cn)") 2 3 email = re.compile("""[w+.]+ # 匹配@符前的部分 4 @ # @符 5 [a-zA-Zd]+ # 邮箱类别 6 .(com|cn) # 邮箱后缀 """, re.X) 7 # 上面两种表达式效果相同
三、函数(常用的)
-
re.match函数,re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none,用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
-
re.search方法,re.search 扫描整个字符串并返回第一个成功的匹配,用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
- 上述二者的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
-
findall,在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。(感觉用的最多)
-
re.compile 函数,compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
四、正则表达式对象
-
re.RegexObject
re.compile() 返回 RegexObject 对象。
- re.MatchObject
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- group() 返回被 RE 匹配的字符串。
这就是正则表达式的学习情况,但是最后的结果不尽人意,有好多的数据无法清洗出来,所以决定更换数据源,在进行爬取