我是张晨,一转眼,我在新课已经学习了很长一段时间。回顾这几个月的时间,我收获了很多知识。这里是我的一点学习笔记。
一、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)
运行结果:
实战示例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)
运行结果:
暂时先分享这么多吧,希望大家在学习过程当中都能有所收获,感谢新课,如果想获取更多资料或者联系加群,可以关注我们新课的微信公众号,后台自动回复获取代码笔记资料。