做网站怎么申请百度推广,广西企业建站,在服务器上布网站怎么做,做汽配找哪个网站好一、什么是Re解析
“Re解析”是指使用正则表达式#xff08;regular expression#xff0c;简称regex#xff09;进行文本解析或匹配的过程。
解析网页内容的三种方式#xff1a;
1、bs4解析#xff08;最简单#xff09;
2、re解析#xff08;解析速度最快#xf…一、什么是Re解析
“Re解析”是指使用正则表达式regular expression简称regex进行文本解析或匹配的过程。
解析网页内容的三种方式
1、bs4解析最简单
2、re解析解析速度最快
3、xpath解析语法规则最舒服
选择解析方法通常取决于要处理的文档类型和具体的任务需求。
Beautiful Soup适合处理不规范的HTML和简单的数据提取
正则表达式适合对文本模式进行精确匹配和替换
而XPath则是处理复杂XML文档和需要精确节点定位的首选工具。 二、正则表达式
正则的语法使用元字符进行排列组合用来匹配字符串。
元字符具有固定含义的特殊符号
在线正则表达式测试网址https://tool.oschina.net/regex/
1、常用元字符
. 除换行符以外的任意字符\w 数字、字母和下划线\W \w的反义\d 数字\D 非数字\s 空白符\S 非空白符\n 换行符\t 制表符 ^ 字符串的开始 比如^\d\d\d\d\d\d$ $ 字符串的结尾 a|b 匹配字符串a或字符串b 比如10010|10086 [...] 匹配字符组中含有的字符 比如[a-zA-Z0-9]表示 匹配所有数字和字母 [^...] 匹配除了字符组中字符 的所有字符
2、量词
量词控制前面的元字符出现的次数
*重复0次或更多次重复1次或更多次重复0次或1次{n}重复n次{n,}重复n次或更多次{n,m}重复n到m次
比如\d表示一串数字前后可以是其他类型的内容 ^\d表示字符串的开头必须是一串数字 前面不能有其他类型的内容
3、贪婪匹配和惰性匹配
.*贪婪匹配.*?惰性匹配
贪婪匹配尽可能多地匹配内容
惰性匹配爬虫常用尽可能少地匹配内容 举个例子
玩儿开心消消乐游戏吗晚上一起玩游戏。干嘛呢打游戏啊
匹配玩儿.*?游戏
结果玩儿开心消消乐游戏
原理回溯算法
先找“玩儿”然后“.*游戏”表示尽可能多地找找到最后一个“游戏”再是“”表示尽可能少地找逼迫着计算机回溯找反方向的最后一个“游戏”。 三、Re模板
Re模板为python自带的内置模块是标准库的一部分不需要自己安装。
六小点
1、findall(正则字符串) 全局匹配返回列表list
2、finditer 全局匹配返回迭代器iter .group()
3、search 仅能匹配出第一个结果 .group()
4、match 从头开始匹配相当于给正则加上^ .group()
5、compile(正则) 预加载
6、?P组名正则 精细筛选 .group“组名”
注意要不要加上“ ” import re# re.findall(pattern,string,flags0)
# 返回字符串中所有符合正则的内容组成一个列表
listre.findall(r\d,我的电话号码是10086他的电话号码是10010)
print(list)
#\d前加r可以防止出现波浪线# re.finditer(pattern,string,flags)
# 返回字符串中所有符合正则的内容不过以match方式呈现组成一个迭代器
itre.finditer(r\d,我的电话号码是10086他的电话号码是10010)
for i in it:print(i.group())
# list可以直接到打印而迭代器需要利用for循环来逐个打印其中内容(迭代器的效率比列表高)
# 迭代器中包含的是match对象要想拿到实际内容需要用到.group()# re.search(pattern,string,flags)
# 返回字符串中第一个符合正则的内容不过以match方式呈现相当于迭代器的第一个迭代结果
sre.search(r\d,我的电话号码是10086他的电话号码是10010)
print(s.group())
# 要想拿到实际数据同样要用到.group()# re.match(pattern,string,flags)
# 从头开始匹配相当于把\d变成了^\d表示字符串的开头必须是纯数字
# 否则会出现AttributeError: NoneType object has no attribute group
mre.match(r\d,10086他的电话号码是10010)
print(m.group())# find全局匹配findall返回列表finditer返回迭代器search匹配第一个match从头开始匹配#预加载预编译正则表达式若正则表达式很长先预加载好后续直接用、反复用可以提高一点效率
# objre.comfile(pattern,flags)
# obj.finditer(string)
objre.compile(r\d)
itobj.finditer(我的电话号码是10086他的电话号码是10010)
for i in it:print(i.group())content
div classaspan id1刘亦菲/span/div
div classbspan id2宋祖儿/span/div
div classcspan id3谷爱凌/span/div# re.S: 让 . 能匹配换行符防止匹配的内容断掉
obj1re.compile(rdiv class.*?span id(?Pid\d)(?Pwahaha.*?)/span/div,re.S)
resobj1.finditer(content)
for i in res:print(i.group(wahaha))print(i.group(id))
# 就是套娃写模板
# 精细筛选可以单独从正则匹配的内容中进一步提取内容(?P组名正则) .group(组名)