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运维开发路上的点点滴滴。。。
原文地址:https://www.cnblogs.com/weijie0717/p/15763651.html