Python正则表达式re.compile()和re.findall()怎么使用
这篇文章主要介绍了Python正则表达式re.compile()和re.findall()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python正则表达式re.compile()和re.findall()怎么使用文章都会有所收获,下面我们一起来看看吧。
前言
在使用爬虫提取网页中的部分信息时,采用到了re.compile()与re.findall()两种方法,目的:把网页中的“某某城市土地规划表”截取并打印出来.
网页中的代码:
<span class='tab-details'>某某城市土地规划表</span>
提取的方法:
def parse_response(html): pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S) items = re.findall(pattern,html) print(items) return items
结果:
['某某城市土地规划表']
这里主要讲解pattern,re.compile()与re.findall()的定义及用法:
pattern :pattern 属性规定用于验证输入字段的正则表达式。
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取代mandocument.write(str2+"<br />"); patt=/(wo)?man/g;patt.compile(patt);str2=str.replace(patt,"person");//用person取代man或者womandocument.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!
re.findall():额,这个最难搞,主要是为了讲解(.*?)
re.findall()函数是返回某种形式(比如String)中所有与pattern匹配的全部字符串,返回形式为数组。
下面是findall()函数的两种表示形式:(上面的代码采取的便是第二种形式):
import rekk = 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的意义:
字符串变为(后面多加了2个b)
str = '''aabbab aabbaa bb'''
参数无re.S,没有把最后一个换行的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.s,因为在爬取网页的内容时是按照一个一个块的来爬取,可以理解为并列部分,会存在/n分行符。
def parse_response(html): pattern = re.compile('class=\'tab-details\'>(.*?)</span>',re.S) items = re.findall(pattern,html) print(items) return items
关于“Python正则表达式re.compile()和re.findall()怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Python正则表达式re.compile()和re.findall()怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341