爬虫-re实战

本文介绍了Python正则表达式中的几个重要标志位,如re.I(忽略大小写匹配)、re.A(ASCII匹配模式)、re.S(使.匹配包括换行符的所有字符)、re.M(多行模式)、re.X(详细模式)和re.U(Unicode匹配),并提供了实战示例,帮助读者更好地理解和运用正则表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我是张晨,一转眼,我在新课已经学习了很长一段时间。回顾这几个月的时间,我收获了很多知识。这里是我的一点学习笔记。

一、re.I

语法: re.IGNORECASE 或简写为 re.I

含义: 进行忽略大小写匹配。

re.findall(r'TM','tm')
[]
re.findall(r'TM','tm',re.I)
['tm']

在默认匹配模式下小写字母tm无法匹配大写字母TM的,而在忽略大小写模式下就可以匹配了。

二、re.A

语法: re.ASCII 或简写为 re.A

作用: 顾名思义,ASCII表示ASCII码的意思,让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII,而不是Unicode。

re.findall(r'\w+','tm真帅')
['tm真帅']#w匹配所有字符

re.findall(r'\w+','tm真帅', re.A)#w匹配字母和数字
['tm']

在默认匹配模式下’\w+'匹配到了所有字符串,而在ASCII模式下,只匹配到了a、b、c(也就是指匹配ASCII编码支持的字符)。注意:这只对字符串匹配模式有效,对字节匹配模式无效。

三、re.S

语法: re.DOTALL 或简写为 re.S

作用: DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符\n。默认模式下.是不能匹配行符\n的。

print('小伍哥\n真帅')#文本中间包含换行符,打印的时候会换行
小伍哥
真帅
re.findall(r'.*','哥\n真帅')
['哥', '', '真帅', '']
re.findall(r'.*','哥\n真帅',re.S )
['哥\n真帅', '']

在默认匹配模式下.并没有匹配换行符\n,而是将字符串分开匹配;而在re.DOTALL模式下,换行符\n与字符串一起被匹配到。

四、re.M

语法: re.MULTILINE 或简写为 re.M

含义: 多行模式,当某字符串中有换行符\n,默认模式下是不支持换行符特性的,比如:行开头和行结尾,而多行模式下是支持匹配行开头的。

print('小伍哥\n真帅')#文本中间包含换行符,打印的时候会换行
小伍哥
真帅
re.findall(r'^真帅','哥\n真帅')
[]

re.findall(r'^真帅','哥\n真帅',re.M)
['真帅']

正则表达式中^表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符\n后面的字符。

**注意:**正则语法中^匹配行开头、\A匹配字符串开头,单行模式下它两效果一致,多行模式下\A不能识别\n。

五、re.X

语法: re.VERBOSE 或简写为 re.X

作用: 详细模式,可以在正则表达式中加注解!

text  = '哥tm帅'

pat   = '''哥 # 本文
             tm  # 强调程度
             帅  # 形容词
        '''
re.findall(pat,text)
[]
re.findall(pat,text,re.X)
['小伍哥tm帅']

可以看到,默认模式下无法识别正则表达式中的注释,而详细模式是可以识别的。当一个正则表达式十分复杂的时候,详细模式或许能为你提供另一种注释方式,但它不应该成为炫技的手段,建议谨慎使用!

六、re.L

语法: re.LOCALE 或简写为 re.L

作用: 由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配,这个标记只能对byte样式有效,该标记官方已经不推荐使用,因为语言区域机制很不可靠,它一次只能处理一个 "习惯”,而且只对8位字节有效。

七、re.U

语法: re.UNICODE 或简写为 re.U

作用: 与 ASCII常量类似,匹配unicode编码支持的字符,但是Python3默认字符串已经是Unicode,所以显得有点多余。

实战示例1:

取出主要几种菜系

https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page=0

import requests
import re
url = 'https://www.meishij.net/chufang/diy/jiangchangcaipu/?&page=0'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42'
}
html = requests.get(url, headers=headers)
# print(html.text)
caixi = re.findall('<dt><a href=".*?">(.*?)</a></dt>',html.text)
print(caixi)

运行结果:

image-20230518174017036

实战示例2:

https://www.douguo.com/jingxuan/24

import requests
import re
url = 'https://www.douguo.com/jingxuan/0'
head_data = {
    # 字典,需要有一个键值对
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
html = requests.get(url, headers=head_data)
title = re.findall('<a class="cookname text-lips" href="/cookbook/.*?.html" target="_blank">(.*?)</a>',
                   html.text)
collect = re.findall('class="view">(.*?)<',html.text)
for title,collect in zip(title,collect):
    print(title,collect)

运行结果:
image-20230518174457709
暂时先分享这么多吧,希望大家在学习过程当中都能有所收获,感谢新课,如果想获取更多资料或者联系加群,可以关注我们新课的微信公众号,后台自动回复获取代码笔记资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值