目录
前言网页中的代码:提取的方法:re.findall中参数re.S的意义:参考:总结前言
在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的“某某城市土地规划表”截取并打印出来.
网页中的代码:
某某城市土地规划表
提取的方法:
def parse_response(html): pattern = re.compile("class=\"tab-details\">(.*?)",re.S) items = re.findall(pattern,html) print(items) return items
结果:
(资料图)
["某某城市土地规划表"]
这里主要讲解pattern,re.compile()与re.findall()的定义及用法:
1.pattern :pattern 属性规定用于验证输入字段的正则表达式。
2.re.compile():compile() 方法用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。
举例:在字符串中全局搜索 "man",并用 "person" 替换。然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman",:
<script type="text/javascript"> var str="Every man in the world! Every woman on earth!"; patt=/man/g; str2=str.replace(patt,"person"); //用person取代man document.write(str2+"
"); patt=/(wo)?man/g; patt.compile(patt); str2=str.replace(patt,"person"); //用person取代man或者woman document.write(str2); </script>
输出:(可见第一行中的man都被person取代,出现了woperson,第二行的的man和woman也被person取代,只有person,没有其他奇奇怪怪的字符串)
Every person in the world! Every woperson on earth!
Every person in the world! Every person on earth!
3.re.findall():额,这个最难搞,主要是为了讲解(.*?)
re.findall()函数是返回某种形式(比如String)中所有与pattern匹配的全部字符串,返回形式为数组。
下面是findall()函数的两种表示形式:(上面的代码采取的便是第二种形式):
import re kk = re.compile(r"\d+") kk.findall("one1two2three3four4") #[1,2,3,4] #注意此处findall()的用法,可传两个参数; kk = re.compile(r"\d+") re.findall(kk,"one123") #[1,2,3]
下面的是常用的正则表达式:
import re str = "aabbabaabbaa" # 一个"."就是匹配除 \n (换行符)以外的任意一个字符 print(re.findall(r"a.b",str))#["aab", "aab"] # *前面的字符出现0次或以上 print(re.findall(r"a*b",str))#["aab", "b", "ab", "aab", "b"] # 贪婪,匹配从.*前面为开始到后面为结束的所有内容 print(re.findall(r"a.*b",str))#["aabbabaabb"] # 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取 print(re.findall(r"a.*?b",str))#["aab", "ab", "aab"] # 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容 print(re.findall(r"a(.*?)b",str))#["a", "", "a"] str = """aabbab aabbaa bb""" #后面多加了2个b # 没有把最后一个换行的aab算进来 print(re.findall(r"a.*?b",str))#["aab", "ab", "aab"] # re.S不会对\n进行中断 print(re.findall(r"a.*?b",str,re.S))#["aab", "ab", "aab", "aa\n b"]
注意".*?"是对它的前后部分作为开始结束部分进行截取,而"(.*?)"也是把其前后作为开始结束,但是只截取括号部分,不包含开始结束部分!!!(同时在对前后部分的选择时要注意特征明确点,就是与众不同的的嘛,防止截取出的是其他部分啊)
re.findall中参数re.S的意义:
1.字符串变为(后面多加了2个b)
str = """aabbab aabbaa bb"""
2.参数无re.S,没有把最后一个换行的aab算进来
print(re.findall(r"a.*?b",str)) #["aab", "ab", "aab"]
3.参数有re.S,不会对\n进行中断
print(re.findall(r"a.*?b",str,re.S)) #["aab", "ab", "aab", "aa\n b"]
在我们一开始的代码中就有re.s,因为在爬取网页的内容时是按照一个一个块的来爬取,可以理解为并列部分,会存在/n分行符。
def parse_response(html): pattern = re.compile("class=\"tab-details\">(.*?)",re.S) items = re.findall(pattern,html) print(items) return items
参考:
1.HTML input pattern 属性
2.Pattern用法(正则表达式)
3.JavaScript compile() 方法
4.Python 正则表达re模块之findall()详解
总结
到此这篇关于Python正则表达式re.compile()和re.findall()的文章就介绍到这了,更多相关Python正则re.compile()和re.findall()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 2充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 3好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 4名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 5亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 6京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 7网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 8市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 9北京市市场监管局为企业纾困减负保护经济韧性
- 10市场监管总局发布限制商品过度包装标准和第1号修改单