爬虫-正则表达式
爬虫-正则表达式
通用爬虫
1. 获取初始url
2. 获得新的url 放入爬取列表内
3. 读取新url
4. 循环知道满足条件
聚焦爬虫
1. 对抓取目标进行描述
2. 获取初始url
3. 获得新url 过滤
4. 将过滤过的url放入爬取列表
5. 读取新url
6. 循环至满足
正则表达式实战
正则表达式是对数据进行筛选的表达式
原子:
原子是正则表达式中最基本的组成单位
每个正则表达式内至少一个原子
原子类型:
1. 普通字符作为原子 a b c ...
2. 非打印字符作为原子 \n \t ...
3. 通用字符作为原子
\w 任意字符或数字或下划线或汉字
\d 任意十进制数字
\s 任意空白符
\W 匹配\w不能匹配的任意字符
4. 原子表 [abc] 表内的可以存在 a[123]b 可以匹配 a1b ...
元字符:
具有特殊含义的字符
. 可以匹配任意字符
^ 可以匹配字符串的开始位置 从字符串开头开始匹配 ^b 当在一组方括号里使用 ^ 时,它表示"非"或"排除"的意思
$ 匹配字符串中结束的位置 从字符串末尾匹配 b$
* 匹配 0次(0次的意思 就是出现0次也会匹配上) 一次 多次 s* 可以匹配 "" s ss sss ...
? 匹配 0次或1次
+ 匹配 一次或多次 不可以匹配 ""
{n} 表示出现n次 s{7} 匹配出现s7次的情况
{n,} 表示至少出现n次 s{7,} 匹配s大于7次的情况
{n,m} 匹配 n-m间的情况
| m|n 匹配m或者n |的优先级比较低
() 避免别的元字符被影响 ...(a|b)... 可以匹配 111b111 但是没有括号就只能匹配 ...a b...
模式修正符:
I 忽略大小写
M 多行匹配
L 本地化识别匹配
U 根据Unicode字符解析
S .也可以匹配换行符
贪婪模式:
p.*y
贪婪模式下 会尽可能多的匹配
pythonpython
会匹配到 pythonpy
懒惰模式:
p.*?y
pythonpython
会匹配到 py
正则表达式函数:
re.match(pat,string)
从字符串中 由左向右 必须从头开始搜索 相当于^xxxx
re.search(pat,,string)
从字符串中 由左向右 结果可以在任何位置 只能搜索一个出来
re.complie(pat).findall(string)
全局搜索 可以把全部的都搜索出来 但是一段只能匹配一次 被匹配过的字符会被踢出字符串内
findall()返回的是括号所匹配到的结果,多个括号就会返回多个括号分别匹配到的结果 所以不能用括号来进行组合
findall本质上是返回多个匹配到的结果,其返回结果为列表类型,无论匹配到多少个;其列表中的每个元素表现形式是
由正则表达式中的括号数量所决定的,如果没有括号即等价于一个括号,那么就是一个字符串,
如果存在两个两个或两个以上就会用元组数据类型储存多个括号内的结果。
pat = "p.*y"
string = "pythonpython"
只会 ['pythonpy']
pat = "p.*?y"
string = "pythonpython"
会 ['py','py']
匹配网站:
pat = "[a-zA-Z]+://[^\s]+(.com|.cn)"
string = "http://www.baiducom.com"
用search来匹配 不可以用findall
pat = "[a-zA-Z]+://[^\s]+.com|[a-zA-Z]+://[^\s]+.cn"
string = "http://www.baiducom1.com http://www.baiducom2.cn"
这个可以用findall来匹配 在findall内 小括号的影响就是匹配的 ()内的内容会被输出 外面的不会输出

浙公网安备 33010602011771号