Re正则表达式
一、介绍
在爬虫数据解析中有三种解析方式
1、re解析 #运行速度最快、效率高、准确性搞。 但是上手难度高
2、bs4解析 #代码简单、但执行效率不高
3、xpath解析 #语法简单,容易上手
注:在线正则表达式:https://tool.oschina.net/regex
二、符号表达式
1 . 匹配除换行符以外的所有字符
2 \w 匹配字符或数字或下划线
3 \s 匹配任意的空白字符
4 \d 匹配数字
5 \n 匹配一个换行符
6 \t 匹配一个制表符
7
8 ^ 匹配字符串的开始
9 $ 匹配字符串的结尾
10
11 \W 匹配非字符或数字或下划线
12 \D 匹配非数字
13 \S 匹配非空白字符
14 a|b 匹配字符a或者字符b
15 () 匹配括号内的表达式,也表示一个组
16 [...] 匹配字符组中的字符
17 [^...] 匹配除了字符组中字符的所有字符
三、量词:控制前面的元字符出现的次数
1 * 重复零次或更多次
2 + 重复一次或更多次
3 ? 重复零次或者1次
4 {n} 重复n次
5 {n,} 重复n次或更多次
6 {m,n} 重复md到n次
四、贪狼匹配和惰性匹配
1 .* 贪狼匹配
2 .*? 惰性匹配,# 在爬虫中使用较多
#实例:
s1 = '玩儿吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏啊'
print('贪狼模式:',re.findall(r'玩儿.*游戏',s1))
print('惰性模式:',re.findall(r'玩儿.*?游戏',s1))
结果:
五、常规使用
1、findall:匹配字符串中所有的符合正则的内容,返回list
li = re.findall(r"\d+","我的电话是10086,我女朋友的电话是10010")
print(li)
结果:
2、finditer:匹配字符串中所有的内容,返回迭代器,从迭代器中拿到内容需要 .group()
rest = re.finditer(r"\d+","我的电话是10086,我女朋友的电话是10010")
for it in rest:
print("电话:",it.group())
结果:
3、search:全文检索,找到一个结果就返回。返回Match对象,拿数据需要 .gruop()
rest = re.search(r"\d+","我的电话是10086,我女朋友的电话是10010")
print(rest.group())
结果:
4、match:从头开始匹配,返回Match对象。拿数据需要 .gruop()
rest = re.match(r"\d+","10086我的电话是10086,我女朋友的电话是10010")
print(rest.group())
结果:
5、预加载正则表达式, re.S:让 . 能匹配换行符
obj = re.compile(r"<div class = '.*?'><span id = '\d+'>.*?</span></div>",re.S)
6、通过(?P<name>正则表达式),提取想要的内容到name中
s = '''
<div class = 'jay'><span id = '1'>土豆</span></div>
<div class = 'jj'><span id = '2'>地瓜</span></div>
<div class = 'sda'><span id = '3'>红薯</span></div>
<div class = 'fbd'><span id = '4'>山药</span></div>
<div class = 'sde'><span id = '5'>白菜</span></div>
'''
re_obj1 = re.compile(r"<div class = '(?P<name>.*?')><span id = '(?P<id>\d+)'>(?P<nr>.*?)</span></div>",re.S)
res1 = re_obj1.finditer(s)
for it in res1:
print(it.group("name"),'---',it.group("id"),'---',it.group("nr"))
结果:
IT运维开发路上的点点滴滴。。。