匹配暗藏的密码(正则表达式第二弹)

Posted 我将在南极找寻你

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匹配暗藏的密码(正则表达式第二弹)相关的知识,希望对你有一定的参考价值。

前文

(点击蓝字进入)

上次经过一番折腾,终于在最后成功匹配到了目标单词(I love you),小白同学感觉很好玩,于是想进一步探索,那么今天就跟着小白同学造作起来吧!

匹配暗藏的密码(正则表达式第二弹)

我们今天的目标是:

待检测的字符串含有特殊符号,以换行符“\n”为例 

目标文本所在的字符串是这样子的:

s='ffsdxxhello xxfgfgxxworldxxhffh
现在我们利用上次说的终极Boss---( .*?)来匹配检测出两个xx之间的字符串(目标文本)。观察发现,咱们的目标文本是“ hello world”,那么计算机的检测结果是否也和我们人工检测出的结果一样呢?

现在我们按照上次讲的方法来操作一下

import re s='ffsdxxhello
xxfgfgxxworldxxhffh'
d=re.findall('xx(.*?)xx',s)

输出结果

                                        ['fgfg']

咦,为什么不一样呢?


细心的你应该发现了,待检测的字符串s是分两行的!

那么肯定存在一个换行符“\n”!

也就是说s实质上是下面这种形式:

s='ffsdxxhello\nxxfgfgxxworldxxhffh'

单独把xx包围的部分提取出来:

xxhello\nxxfgfgxxworldxx

没错,放大的部分属于第一行的内容。由于在第一行只有一个xx,所以匹配无效;接下来计算机开始检测第二行,发现“ffgg”被xx包围,于是将”ffgg“检测了出来;接着检测,发现只在最后出现了xx,无匹配目标,检测结束。


那如何才能检测出来我们的正确目标”hello world“呢?

换句话说,就是如何才能不因为换行而中断局部的检测呢?

也就是说,我们要将换行符”\n“看做字符串而不是起到换行作用的键。

Python提供了一种方法,即.S

使用方法如下:

import re
s='ffsdxxhello
xxfgfgxxworldxxhffh'
d=re.findall('xx(.*?)xx',s,re.S)
结果:>>> d ['hello\n', 'world']

“是不是很神奇呢,自己动手操练一下吧!”,小白说。

以上是关于匹配暗藏的密码(正则表达式第二弹)的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(第二弹)

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

正则匹配:Email 密码强度 身份证 手机号 日期等

js密码正则表达式:要求包含大小写字母、数字和特殊符号,8~16位

js密码正则表达式:要求包含大小写字母、数字和特殊符号,8~16位