re解析——正则表达式

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"))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值