python re.sub_Python: re.sub()第二个参数

起源:

问题源于解析kissanime.io这个网站。

为反扒抑或是防止ddos攻击,此视频页面,初进去会有个5秒延迟并提交一表单验证。而其表单验证,为下面一段html代码:

求jschl-answer值 ,用了一段js代码,此段js代码为随机生成,如下:

var s,t,o,p,b,r,e,a,k,i,n,g,f, nyqPwxi={"KxtkYgr":+((!+[]+!![]+!![]+[])+(+!![]))};

t= document.createElement('div');

t.innerHTML="x";

t= t.firstChild.href;r = t.match(/https?:\/\//)[0];

t= t.substr(r.length); t = t.substr(0,t.length-1);

a= document.getElementById('jschl-answer');

f= document.getElementById('challenge-form');

;nyqPwxi.KxtkYgr*=+((!+[]+!![]+[])+(!+[]+!![]+!![]));nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(+!![]));nyqPwxi.KxtkYgr*=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));nyqPwxi.KxtkYgr+=!+[]+!![]+!![];nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(+!![]));a.value = parseInt(nyqPwxi.KxtkYgr, 10) + t.length; '; 121'f.submit();

没有格式化,比较凌乱。

由其可见,jschl-answer值域,是通过一系列公式运算所得。运行js得到其值,就可以模拟表单提交,通过验证

1、获取需要的js代码段

不外乎用到re这个东西。参照一个开源项目,通过以下python代码,实现js代码提取:

try:

js= re.search(r"setTimeout\(function\(\){\s+(var"

"s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n", body).group(1)exceptException:raise ValueError("Unable to identify Cloudflare IUAM Javascript on website.")

js= re.sub(r"a\.value = (parseInt\(.+?\)).+", r"\1", js)

js= re.sub(r"\s{3,}[a-z](?: = |\.).+", "", js)

js= re.sub(r"[\n\\']", "", js)if "parseInt" not injs:raise ValueError("Error parsing Cloudflare IUAM Javascript challenge.")

js= js.replace('parseInt', ';return parseInt')

js= 'function answer(){%s}' % js

中间这一段:

js = re.sub(r"a\.value = (parseInt\(.+?\)).+", r"\1", js)

被蒙到了!对re.sub运用尚未纯熟,此写法,一开始忽住了我,随搜集其做研究学习,倒也有些收获。

2、re.sub(pattern, repl, string, count=0, flags=0)

这是它的原型,网上对此式解说文章,多不胜数。对第二个参数,repl,上述用法,述者寥寥。但其功能,是以第一个参数,pattern中第一个组中值,替换pattern所匹配的字串,其格式为\number,编号从1开始第应第1组,以此类推,功能与\g相同,为简洁写法。

比如:

s = '2017-01-22's= re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2-\3-\1', s)print s #01-22-2017

r'\g<0>'能匹配pattern所适配的字串,而r'\0'却不能,这是测试中发现其不同处。

若在patter中有\number写法,则是要匹配其中分组,如下写法:

inputStr = "hello crifan, nihao crifan";

replacedStr= re.sub(r"hello (\w+), nihao \1", "crifanli", inputStr);print "replacedStr=", replacedStr; #crifanli

它匹配了inuptStr整个字串,此字串,被crifanli完整替换之。

3、其它写法

repl除了字串外,它还可以是函数,以对匹配到的组,做其它操作。

照搬一个例子:

defreplace_digit(m):

ss= u'〇一二三四五六七八九'index=int(m.group())returnss[index]

s= u'1990年3月27日'result= re.sub(u'\d', replace_digit, s, count=4)print result #一九九〇年3月27日

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值