cpu密集型程序:主要
正则表达式
作用:对数据的匹配/过滤
特点:强大,通用
所有的正则加上r字符一定没毛病
使用:
import re
match()函数作用:从头开始匹配,失败则返回
search()函数作用:从头匹配到尾,成功返回对象,失败往后搜索,最终没有匹配返回空
匹配结果对象 = re.match(r"正则表达式",数据)
匹配结果对象 = re.search(r"正则表达式",数据)
search
输出结果 :结果对象.group()
没有成功:成功:返回结果对象 失败:往后搜索,最终没有匹配返回空
match
输出结果 :结果对象.group()
没有成功:成功:返回结果对象 失败:为None
匹配一个字符-元字符
. 字符 匹配除换行符之外的任意一个字符
[]字符 匹配集合中的任意一个字符
[a-z] 匹配字符范围
[^] 禁止匹配集合中的任意一个字符
\d 匹配0-9任意字符
\D 匹配任意一个非数字字符
\s 匹配任意一个空白字符
\S 匹配任意一个非空白字符
\w 匹配数字 字母 下划线任意一个字符
\W 匹配任意一个非单词字符
匹配多个字符 - 量词
{n} 匹配N次
{n,m} 匹配至少n次,最多m次
*号 匹配0次或者任意多次
+ 匹配至少一次
? 匹配0-1次,可有可无
匹配开始位置和结束位置
开始位置:r"^x" 要求以..开始
结束位置:r"x$" 要求以..结束
匿名分组:此时必须加r
目的:将数据从整体中提取出来
创建:r"(正则)"
获取方式: 匹配结果对象.group(分组编号)
引用分组数据:在正则后续位置使用前面分组的数据
r '() \分组编号'
| 匹配左右表达式:或
() 匹配括号中 | 左右的任何一个表达式
print(re.search("^\w{4,16}@(qq|sina).com$" ,"12344@sina.com").group())
有名分组 命名分组
分组名字
创建:r"(?P<分组别名>正则)"
获取数据:结果对象.group('分组名字')
引用:(?P = 分组名)
应用场景:在分组很多时,引用复杂,此时修改分组导致编号变化,匿名分组引用会失效
re高级模块
search 只查找一次,返回匹配结果
findall 从数据中查找制定规则的所有数据,返回值是包含所有结果的 列表
re.findall(r"",数据)--->[匹配结果,...]
sub 将匹配的数据进行替换
re.sub(r"\d+", "666" , "c=1 c=2 c=3",count = 1)
参数 一 二 三 count
将 参数三 中的符合 参数一 规则的数据替换成 参数二 count 确定替换次数,返回值为最终替换后的结果
注:参数二中不仅仅可以是直接的字符串数据,
还可以是一个函数名称<函数参数 返回值要求为str类型>
def func(matchobj):
"""参数是包含了匹配结果的结果对象 返回值是替换后的数据"""
#将正则中匹配的数字构成+1
data = matchobj.group()
print(data)
data = 1 + int(data)
#返回值必须是str类型
return str(data)
筛选网页数据
re.sub(r"\s|</?\w+>| " , "" , data)
split 匹配进行切割字符串,返回列表
re.split(",|:",mystr,maxsplit=1)
正则条件 内容 次数
贪婪模式 与非贪婪模式
默认贪婪模式
非贪婪 在"*","?","+","{m,n}" 后加?,使贪婪变为非贪婪
re.serach(r"https://.+\.jpg", url).group()
re.serach(r"https://.+?\.jpg", url).group()
相对概念
前提条件:能否满足整体正则表达式匹配 尽量贪婪
r字符:
对正则中的 '\' 自动加 '\' 进行转义