re解析——正则表达式
Regular Expression 正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则
我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了
- 正则的优点:速度快,效率高,准确性高
- 正则的缺点:新手上手的难度有点高
- 正则的语法:使用元字符进行排列组合来匹配字符串,
- 元字符:具有固定含义的特殊符号
不过只要掌握了正则编写的逻辑关系,写出一个提取页面内容的正则其实并不复杂
可以在线测试正则表达式:https://tool.oschina.net/regex/
常用元字符:
**量词:*控制前面的元字符出现的次数
贪婪匹配和惰性匹配:
1、. 贪婪匹配
2、.*? 惰性匹配
没有问号匹配最长的
有问号匹配最短的
re模块
那么接下来的问题是:正则我会写了,怎么在python程序中使用正则呢?答案是re模块
re模块中我们只要记住这几个功能就足够我们使用了
一、findall查找所有正则匹配项,返回list
#1、findall查找所有正则匹配项,返回list
import re
ls=re.findall(r"\d+","我的电话是10010,我女朋友的手机号是10016")
print(ls)
二、search会进行匹配,但是如果匹配到了第一个结果,如果匹配不上search只会的结果是None
#2、search会进行匹配,但是如果匹配到了第一个结果,如果匹配不上search只会的结果是None
ret = re.search(r"\d+","我的电话是10010,我女朋友的手机号是10016").group()
print(ret)
三、match 只能从字符串的开头进行匹配
#3、match 只能从字符串的开头进行匹配
ad = re.match("j","fvjjjbr")
print(ad)
ae = re.match("j","jbr").group()
print(ae)
四、finditer 和findall差不多,只不过这时返回的是迭代器(重点)
#4、finditer 和findall差不多,只不过这时返回的是迭代器(重点)
it = re.finditer(r"\d+","我的电话是10010,我女朋友的手机号是10016")
for i in it:
print(i.group())#依然需要分组
五、compile() 可以将一个长长的正则进行预加载,方便后面的使用
#5、compile() 可以将一个长长的正则进行预加载,方便后面的使用
#将正则表达式编译成为一个,正则表达式对象,规则要匹配的是三个字符
obj = re.compile(r"\d{5}")
ret1 = obj.search("我的电话是10010,我女朋友的手机号是10016").group()
print(ret1)
ret2 = obj.findall("我的电话是10010,我女朋友的手机号是10016")
print(ret2)
ret3 = obj.finditer("我的电话是10010,我女朋友的手机号是10016")
for i in ret3:
print(i.group())
ret4 = obj.match("我的电话是10010,我女朋友的手机号是10016")
print(ret4)
六、正则中的内容如何单独提取?单独获取到正则中的具体内容可以给分组起名字
# 6、正则中的内容如何单独提取?单独获取到正则中的具体内容可以给分组起名字
import re
s = """
<div class='jay'><span id='1'>周杰伦</span></div>
<div class='jj'><span id='2'>胡一菲</span></div>
<div class='kk'><span id='3'>秦俊杰</span></div>
<div class='ll'><span id='4'>杨幂</span></div>
<div class='pp'><span id='5'>杨紫</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<name>.*?)</span></div>",re.S)
#re.S:让.能匹配换行符
# (?P<分组名字>正则)可以单独从正则匹配的内容中进一步提取内容
result = obj.finditer(s)
for it in result:
print(it.group())
print(it.group("name"))
print(it.group("id"))