大学生 · 2015/03/15 12:57
0x00 前言
自动生成正则表达式这个话题其实国外有相关的研究,这次的使用的方法是我按一个论文的思路做实现的时候想到的。所谓的自动生成其实没有想象的那么高大上,其实就是使用了一些非常简单的思路进行组合。文中提到的方法已经使用python进行了实现,效果就我本身提供的几个二逼的数据来说是不错的,但是我不好评价真实场景下的效果,还有需要注意的就是我文中提供的代码适合生成一些简单的正则表达式。
正则表达式本身的存在是为了匹配具有某个固定模式的文本,既然目标具有固定的模式,那么自动生成就是存在可能性的,先思考一个思路,我们写一个正则表达式的时候我们在思考什么,我们在思考例子,比如我们想去匹配网址,那么我们就会思考不同的例子,比如www.baidu.com www.python.org au.fuck.com,都代表了不同的例子,我们会从其中抽取他们共有的模式编写可以进行匹配的正则表达式语法。
0x01 思考模式
1. 正则表达式
我们需要先去思考正则表达式本身所具有的模式,我们先做一个简单的假设,假设正则表达式本身具有两种模式,一种用于匹配具体的字符串 比如 “baidu”,“google”,“fuck you”,我们称为 FullPatten,另外一种用于匹配模仿的字符串,比如纯数字等等,称为HalfPatten。
2. 共有模式
所谓的共有,就是都拥有的元素。比如 www.baidu.com www.google.com www.hello.com 。我们可以显而易见的看出,三个例子共同存在的元素很多,比如都存在 "www.", ".com" 或者点号和 w,c,o,m....可以看出这我们思考的这几个例子都有一些共同的模式。
3. 丢一起
现在把我们思考出来的模式组合到一起,就是说我们要做的事只是简单的给计算机输入几个栗子,然后让计算机得出共有的模式去生成我们想要的正则表达式。打个比方,我们现在有几个栗子:
example = [www.baidu.com, www.google.com, www.hello.com]
复制代码
然后计算机得出最长的的共有字符串:
union = ['www.', '.com']
复制代码
我们转化成正则表达式的模式后:
regexPatten = [FullPatten, HalfPatten, FullPatten]
复制代码
然后迭代生成正则表达式:
re = "www.\w+.com"
复制代码
好了,本次教程就到这里。
开个玩笑,这种二逼的东西就怎么可能浪费我这几天的美剧时间,只要思考几个相反的例子我们就会很容易的得出上面基于规则生成的破逼玩意有多么坑爹。比如如果我们想匹配 “www.au.baidu.com” 比如 我们想匹配 .com 和 .au 结尾的怎么办,或者我们只是想匹配所有的url?下面我们就需要去解决这个问题。
4. 信息熵
当年香农大神提出了信息熵这个概念用于描述事物的不确定性,什么是不确定性,比如1+1=?对于学过加法的你来说它具有不确定性吗?没有,那么他的信息熵就是0。如果问的是 你明天会不会在公司楼下碰见美女,它具有不确定性么?有,很大。。。。。
0x02 数据的多样性
上面的机制的缺点在于没有考虑到数据的多样化,和外面的世界太危险。我们先思考HalfPatten然后将其写成模块,那么现在我们先思考HalfPatten的价值,就是用于匹配模糊的数据,比如 数字 \d ,字母\w 任意字符 . ,有一个问题,所谓的模糊数据是所有的,还是有固定长度的。比如上面的模糊字符串 google,hello,baidu 我们是匹配长度为 5到6的还是 直接任意字符 ?
我们需要一种简单暴力的方式可以描述数据的