【python爬虫】re正则表达式


一、正则表达式

正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则

我们抓取到的网页源代码本质上是一个超级长的字符串,想从里面提取内容,用正则无疑是最合适的方法。


正则的优缺点

正则的优点:速度快、效率高、准确性高
正则的缺点:上手难度对于新手来说非常不友好

正则的语法

使用元字符进行排列组合用来匹配字符串:在线测正则表达式https://tool.oschina.net/regex/(从开源中国中寻找),我们可以在这个页面中检验,我们所写的正则表达式是否正确,是否能获得我们想要的东西。
在这里插入图片描述

元字符:具有固定含义的特殊符号

常用元字符:(每一个默认只代表一个字符)

 \.      匹配除换行符以外的任意字符
 \w     匹配字母或数字或下划线
 \s     匹配任意的空白符
 \d     匹配数字
 \n     匹配一个换行符
 \t     匹配一个制表符

 ^      匹配字符串的开始
 $      匹配字符出的结尾

 \W     匹配非字母或数字或下划线
 \D     匹配非数字
 \S     匹配非空白符
 a|b    匹配字符a或b
 ()     匹配括号内的表达式,也表示一个组
 [...]  匹配字符数组中的字符
 [^...] 匹配除了字符组中字符的所有字符

量词:控制前面的元字符出现的次数

*       重复零次或更多次
+       重复一次或更多次
?       重复零次或一次
{n}     重复n次
{n,}    重复n次或更多次
{n,m}   重复n到m次

贪婪匹配和惰性匹配

.*      尽可能多的匹配字符
.*?     让*尽可能少的匹配字符

二、正则表达式小练

import re
##findall:匹配字符串中所有的符合正则的内容
lst = re.findall(r'\d+', '我的电话号码是:10086,我的QQ是:123456')
print(lst)

[‘10086’, ‘123456’]

##finditer:匹配字符串中所有的符合正则的内容[返回的是迭代器]
it = re.finditer(r'\d+', '我的电话号码是:10086,我的QQ是:123456')
for i in it:
    print(i.group())

这里需要注意,finditer返回的是一个迭代器,里面的内容无法直接打印,必须通过一个for循环来输出

10086
123456

##search返回的是match独享的对象,找到一个结果就返回
s = re.search(r'\d+', '我的电话号码是:10086,我的QQ是:123456')
print(s.group())

10086

##match从头开始匹配
a = re.match(r'\d+', '10086,我的QQ是:123456')
print(a.group())

10086

##预加载正则表达式
obj = re.compile(r'\d+')
ret = obj.finditer('我的电话号码是:10086,我的QQ是:123456')
for i in ret:
    print(i.group())

10086
123456

#正则匹配空格也需要注意
#(?<name>正则可以单独从正则匹配的内容中进一步提取内容)
b = """
<div class='jay'><span id='1'>达娃大</span></div>
<div class='jj'><span id='2'>而他</span></div>
<div class='jolin'><span id='3'>他问题</span></div>
<div class='syhr'><span id='4'>儿童</span></div>
<div class='dwad'><span id='5'>去问轻柔</span></div>
"""

jay = re.compile(r"<div class='(.*?)'><span id='(.*?)'>(.*?)</span></div>",re.S) #re.S表示匹配任意字符包括换行符
ddd = jay.finditer(b)
for i in ddd:
    print(i.group(1),i.group(2),i.group(3))

jay 1 达娃大
jj 2 而他
jolin 3 他问题
syhr 4 儿童
dwad 5 去问轻柔

总结

以上就是re正则表达式的一些简单的内容介绍和re的一些基本语法,re使用环境非常广泛,但是不熟练的话很难掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值