python爬虫笔记之re.compile.findall()

re.compile.findall原理是理解了,但输出不大理解(主要是加了正则表达式的括号分组) 

一开始不懂括号的分组及捕捉,看了网上这个例子(如下),然而好像还是说不清楚这个括号的规律(还是说我没找到或是我理解能力太差),还是看不出括号的规律,于是更多的尝试(第二张大图),并最后总结规律。

 

 

下图是为了尝试出括号分组的规律,下面是总结

 

就从最后一次匹配说起吧

 

分析:首先是匹配的顺序,分析某个括号时,暂时去掉其它括号,易读

第一步,先对整个‘ ’内的规则作出匹配,整体匹配,先去括号(易读),即先从s中匹配出第一个【\w+\w+\s+\w+\s+\w+】(去括号的样子),但由于没有括号将这个整体扩上,所以没有捕捉(即不用输出),第一个匹配到的大字符串是“qew rty uio”

【可以这样一个个对应】

\w+  \w+  \s+  \w+  \s+  \w+

  |        |        |       |       |       |

 qe     w             rty           uio

对应图

第二步,匹配到的字符串再进行匹配捕捉,即输出,现在从左往右,一个个左括号捕捉起,第一个左括号【(\w+\w+\s+\w+)】(暂时去掉了嵌套在中间的左括号,易读),则匹配到上面字符串中(“qew rty uio”)的"qew rty"(可对照上面的对应图),由于是括号内,所以捕捉(即输出)

第三步,第二个括号,\w+(\w+)\s+\w+(暂时去掉其它括号) 匹配上一括号中的字符串(“qew rty”),即是匹配到‘w’(可对照上面的对应图),由于是括号内,所以捕捉(即输出)

第四步,第三个括号,\w+\w+\s+\w+(\s+\w+)(暂时去掉其他括号)匹配并输出第一步中的字符串,即是“uio”

 

总结

     1、首先全部去括号的匹配,画出对应图,这样很清晰,然后看括号内的即捕捉输出,然后在匹配的文本(s)再寻找下一个匹配的大字符串,一直找下去……

          2、去括号是为了清晰的分析,主要注意从第一个左括号开始分析起

          3、如果是嵌套括号,如(((a)b)(c)d),若要捕捉a括号的字符,则先需要匹配最外面的括号,然后在慢慢往里面匹配,即是先匹配出d括号的内容,再在d括号里面匹配出b括号的内容,再在b括号中匹配出a括号的内容,然后所有括号里的,输出,按左边第一个括号所匹配的字符串排列:(d,b,a,c)

 

 

 

 

如有错误,麻烦及时指正,谢谢!

 

 

转载于:https://www.cnblogs.com/4wheel/p/8497121.html

re.compile是将正则表达式编译成一个对象,可以重复使用,提高效率。而re.findall是用于在字符串中查找所有匹配正则表达式的子串,并返回一个列表。re.compile用于编译正则表达式,re.findall用于在字符串中查找匹配的子串。 ### 回答2: 在使用Python中的re模块进行正则表达式处理时,常常会遇到re.compilere.findall这两个方法。两者的作用都是用来处理字符串中的正则表达式匹配,但是具体有哪些区别呢? re.compile是将正则表达式字符串编译成一个可重用的正则表达式对象,这个对象可以通过调用其它方法来执行各种操作,比如查找、替换等。使用re.compile可以提高程序的效率,因为它只需要编译一次正则表达式,以后每次调用可以直接使用已经编译好的正则表达式对象,避免了反复编译的开销。 re.findall则是用来查找字符串中所有符合正则表达式模式的所有子串,并以列表形式返回。例如,如果我们想要在一个字符串中找出所有由数字组成的子串,可以使用re.findall(r'\d+', str),其中r'\d+'表示由一或多个数字组成的正则表达式模式。re.findall返回的结果是一个列表,其中包含了所有符合正则表达式模式的子串。 因此,re.compilere.findall有相同的作用,都用于处理正则表达式匹配,但是其具体的操作层次不同。re.compile是用来编译正则表达式字符串,生成一个可重用的正则表达式对象。而re.findall则是在给定的字符串中查找使用正则表达式匹配的所有子串,并将它们以列表形式返回。在实际使用中,我们可以根据具体需求进行选择,使用适当的方法来完成所需的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值