专栏首页SeanCheney的专栏Python正则表达式匹配换行符

Python正则表达式匹配换行符

默认时,Python正则中的.是不能匹配换行符的,如果碰到下面这种带有换行的js字符串该怎么办呢?

下面用到的js2py,是一个用Python执行js,可对JavaScript渲染的库。这里用来拼接出真正的url

import re
import js2py

txt = '''
(new Image()).src = 'https://weixin.sogou.com/approve?uuid=' + 'b9be9b04-7bcd-4a70-b412-70e1eb33fd1c' + '&token=' + '0177FFA5CCF44B442226BA55C2563A922371B60D5DF19CE0' + '&from=inner';

    setTimeout(function () {
        var url = '';
        url += 'http://mp.w';
        url += 'eixin.qq.co';
        url += 'm/s?src=11&';
        url += 'timestamp=1';
        url += '576115412&v';
        url += 'er=2029&sig';
        url += 'nature=3OfX';
        url += 'g*vTl0xc6Uv';
        url += 'afcTMAEg9B8';
        url += 'Ed0UQLlh744';
        url += '19o9uA1j0KFuh1W99OnNadkNegwwNkr5B7kI4g7k9vQzqb-BPoSoEESUUcMlerw99vocCRWur0Fp9fVATo*2aTRYiUo&new=1';
        url.replace("@", "");
        window.location.replace(url)
    },100);      
'''

# 这里用的是`.*?`匹配换行符
url_var = re.search('(var url.*?url\.replace\("@", ""\);)', txt).group(1)
url_rendered = js2py.eval_js(url_var)
print(url_rendered)

强行照上面写的话,结果就会报错。

解决方法之一,是使用[\s\S]*?代替.*?[\s\S]是可以匹配包括换行符的任意字符的。

import re
import js2py

txt = '''
(new Image()).src = 'https://weixin.sogou.com/approve?uuid=' + 'b9be9b04-7bcd-4a70-b412-70e1eb33fd1c' + '&token=' + '0177FFA5CCF44B442226BA55C2563A922371B60D5DF19CE0' + '&from=inner';

    setTimeout(function () {
        var url = '';
        url += 'http://mp.w';
        url += 'eixin.qq.co';
        url += 'm/s?src=11&';
        url += 'timestamp=1';
        url += '576115412&v';
        url += 'er=2029&sig';
        url += 'nature=3OfX';
        url += 'g*vTl0xc6Uv';
        url += 'afcTMAEg9B8';
        url += 'Ed0UQLlh744';
        url += '19o9uA1j0KFuh1W99OnNadkNegwwNkr5B7kI4g7k9vQzqb-BPoSoEESUUcMlerw99vocCRWur0Fp9fVATo*2aTRYiUo&new=1';
        url.replace("@", "");
        window.location.replace(url)
    },100);      
'''

# 这里用的是`[\s\S]*?`匹配换行符
url_var = re.search('(var url[\s\S]*?url\.replace\("@", ""\);)', txt).group(1)
url_rendered = js2py.eval_js(url_var)
print(url_rendered)

解决方法之二,设置re.DOTALL,就可以使.匹配换行符了,如下:

import re

txt = '''
(new Image()).src = 'https://weixin.sogou.com/approve?uuid=' + 'b9be9b04-7bcd-4a70-b412-70e1eb33fd1c' + '&token=' + '0177FFA5CCF44B442226BA55C2563A922371B60D5DF19CE0' + '&from=inner';

    setTimeout(function () {
        var url = '';
        url += 'http://mp.w';
        url += 'eixin.qq.co';
        url += 'm/s?src=11&';
        url += 'timestamp=1';
        url += '576115412&v';
        url += 'er=2029&sig';
        url += 'nature=3OfX';
        url += 'g*vTl0xc6Uv';
        url += 'afcTMAEg9B8';
        url += 'Ed0UQLlh744';
        url += '19o9uA1j0KFuh1W99OnNadkNegwwNkr5B7kI4g7k9vQzqb-BPoSoEESUUcMlerw99vocCRWur0Fp9fVATo*2aTRYiUo&new=1';
        url.replace("@", "");
        window.location.replace(url)
    },100);      
'''

pattern = re.compile(r'(var url.*?url\.replace\("@", ""\);)', re.DOTALL)
res = pattern.search(txt).group(1)
print(res)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python模拟登陆 —— 征服验证码 9 微博weibo.com

    登录界面 抓包分析可以使用Http Analyzer,Filders,但是看起来很复杂,还是使用火狐好(chrome远远没有火狐好用)。 首先,在输入用户名后,...

    SeanCheney
  • 《Scikit-Learn与TensorFlow机器学习实用指南》 第15章 自编码器

    自编码器是能够在无监督的情况下学习输入数据的有效表示(叫做编码)的人工神经网络(即,训练集是未标记)。这些编码通常具有比输入数据低得多的维度,使得自编码器对降维...

    SeanCheney
  • 《利用Python进行数据分析·第2版》第10章 数据聚合与分组运算10.1 GroupBy机制10.2 数据聚合10.3 apply:一般性的“拆分-应用-合并”10.4 透视表和交叉表10.5 总

    对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。...

    SeanCheney
  • python实现简单爬虫

    前段时间将python的基础写在了头条号里面,最近一段时间在研究前端知识和laravel框架,把python的代码放了,今天不忙写了一个简单的爬虫。下面是代码(...

    申霖
  • 自己打造基于命令行的书签管理工具

    章鱼喵
  • Python 爬虫第三篇(循环爬取多个网页)

    本篇是 python 爬虫的第三篇,在前面两篇 Python 爬虫第一篇(urllib+regex) 和 Python 爬虫第二篇(urllib+Beautif...

    keinYe
  • 外行学 Python 爬虫 第八篇 功能优化

    在前一篇中讲了如何开启多线程来加快爬虫的爬取速度,本节主要对爬虫爬取内容机型优化,将生产商信息单独独立出来作为一张数据库表,不再仅仅是存储一个生产商的名称,同时...

    keinYe
  • python 重定向获取真实url

    py3study
  • 三步爬取半次元热门图片

    边学习,边创造是一件开心的事情,因为你会清楚的认识到自己的状态,以及那充满内心的成就感,因此从写爬虫开始学习python是一个简单粗暴的提升路线,不知不觉了解很...

    py3study
  • Django之路由层

    以图书管理系统为例我们在数据库建立四张表:图书表、出版社表、作者表、作者信息,这里表与标的对应关系如下:

    GH

扫码关注云+社区

领取腾讯云代金券