(一)正则表达式
Regular Expression,正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则。正则表达式在信息校验,爬虫等方面应用较多。
优点:速度快,效率高,准确性高
缺点:不好理解
常用元字符与量词:
. 匹配除换行意外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意空白字符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串开始
$ 匹配字符串结尾
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符外的所有字符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
.* 贪婪匹配
.*? 惰性匹配
(?=.*[A-Z]) :必须包含大写字母一个
举例:
str :我的电话是10086,tom的电话是10001
reg:\d+
结果:
10086
10001
str :你今晚玩什么游戏,我想玩策略类游戏或者休闲小游戏。
reg :玩 .*? 游戏
结果: 玩什么游戏
str :你今晚玩什么游戏,我想玩策略类游戏或者休闲小游戏。
reg :玩 .* 游戏
结果: 玩什么游戏,我想玩策略类游戏或者休闲小游戏
(二)python re模块
1、findall查找所有,返回list
2、search会进行匹配,但是如果匹配了第一个结果,就会返回这个结果。如果匹配不上就会返回None
3、match只能从字符串开头进行匹配
4、finditer和findall差不多,只不过它返回的是迭代器对象
在爬虫时,我们经常需要匹配html,下面举个简单例子:
<div class='(.*?)'><span id='(.*?)'>(.*?)</span></div>
正则表达式为如上方式时,发现把整个标签都匹配下来,要是想得到class或者id亦或是标签中的内容时,正则表达怎么写呢?正则表达式可以改为如下方式:
(?P<分组名字>正则) 可以单独从正则匹配的内容中提取到内容
<div class='(?P<random_name1>.*?)'><span id='(?P<random_name2>.*?)'>(?P<random_name3>.*?)</span></div>
举一个豆瓣电影top榜的例子:
先给出代码和正则表达式
// 正则表达
obj = re.compile(r'<li>.*?<img width="100" alt="(?P<movie_name>.*?)".*?</li>', re.S)
我们在根据网页源代码提前需要的内容时,一般都可以使用 .*? 匹配掉不需要的内容,知道出现我们需要的内容。