关于python在re.sub中使用lambda表达式(lambda matched: table.get(matched.group('value')))

今天做爬虫,百度图片的json中url是加密的,就在网上查怎么解密,查到了一个大佬的方法这里献上链接
python版本的https://blog.csdn.net/mengyanyuan8023/article/details/90269579
还有另一位大佬分别使用c语言,JavaScript,php写的
https://blog.csdn.net/hbuxiaoshe/article/details/44780653

我用的是python做爬虫所以我主要看了python版本的但是我自己太渣,大佬的代码有的地方我看不太懂,通过一些资料还有自己的一些尝试算是解决了自己的困惑

主要是这一行代码:

url = re.sub(r'(?P<value>_z2C\$q|_z\&e3B|AzdH3F+)', lambda matched: table.get(matched.group('value')), url)

直接给我看蒙了,但是我运行了一下成功解码。
这里我说一下我自己通过查资料得到的自己的理解

首先re.sub的用法:
re.sub(pattern, repl, string, count=0, flags=0)

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

?P\<value\>的意思就是命名一个名字为value的组,后面的内容才是匹配规则,所以后面那个lambda表达式中的group(‘value’)也就不难理解了,但是这个matched我依旧想不通为啥,这只是一个相当于形参的东西,没有实参为啥可以输出结果。然后我就想看看matched是什么东西

import re

def fun(x):
    print(x)
a = "123asd213"

re.sub(r'\d',lambda matched:fun(matched),a)

<re.Match object; span=(0, 1), match=‘1’>
<re.Match object; span=(1, 2), match=‘2’>
<re.Match object; span=(2, 3), match=‘3’>
<re.Match object; span=(6, 7), match=‘2’>
<re.Match object; span=(7, 8), match=‘1’>
<re.Match object; span=(8, 9), match=‘3’>

可以看出这个matched就是每一次匹配到的结果
我理解的就是,sub这个函数会使用正则进行匹配,匹配到结果之后就调用lambda并且把匹配到的结果当做参数传递,我打开sub源码稍微看了一下(因为看不懂太多…………)。
在这里插入图片描述
这句话的意思就是:如果它是可调用的,则传递匹配对象并必须返回要使用的替换字符串。
就是这个表达式必须要返回用来替换他的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值