认识正则基础

安全工具 2017-12-03

本篇文章的主要内容是使用Python匹配ASCII字符串的各种姿势。

基本知识

ASCII码对照表.

1.jpg

元字符对照表

2.jpg

什么是元字符

如上面元字符对照表里的所有字符在正则中表现是一个范围而不能作为字符匹配,例如[0-9]之中的-用来表示0到9的一个范围,而不能匹配横线字符。

什么是转义

像$、^ 这类元字符,在正则中有特殊的含义,有的时候并不需要表示其特殊含义只想表示普通字符的含义,此时就必须对元字符做转义,可以使用反斜杠转义元字符,如^经过转义后变为 \ ^。

详细解读正则的使用

测试页面

3.jpg

将以上代码保存为test.txt

4.jpg

将以上代码保存为test.py用来测试正则表达式的功能。

功能解释

获取代码中的手机号

正则表达式可以有如下集中方式:

1 ([0-9]{11})

2 (\d{11})

3 ([\x30-\x40]{11})

分别使用以上正则进行测试,如下图:

5.jpg

由上可知,表示数字有三中方式分别是[0-9]、\d、[\x30-\x40],数字0的ASCII值在表中查出是48,转为十六进制为30,同理9的ASCII值的十六进制是40,所以就有了[\x30-\x40]的用法,通过这种方式我们可以匹配任意ASCII码表中的字符。下面我们试着匹配测试文件中的冒号,结果如下:

6.jpg

花括号的用法在元字符表中有三中方式,测试结果如下:

7.jpg

括号作用是把括号内的表达式做子表达式来用,在元字符表中有四种用法,测试结果如下:

8.jpg

对于这个测试结果,后面三中不是很理解,希望有懂得给我讲讲。

中括号的作用是表示字符的范围,在元字符表中有四种用法,测试结果如下:

9.jpg

测试发现,[a-d]与[abcd]的结果一样,[a-z]与[abcd]的结果一样,前面的作用就是获取包含adcd的字符串,后面的作用就是获取不包含abcd的字符串。

获取源文件中的邮箱

测试结果如下:

10.jpg

由测试结果可以看出来,\w和[a-zA-Z0-9]的作用是一样的,相比之下*和+的结果一样,但是他们稍微又一点不同就是 *表示为可以没有,而+为至少匹配一个。而 *又等同于{0,},+等同于{1,}。由于\s的作用是匹配空白字符,所以结果中虽然出现了邮箱地址,但是后面多了一个标签,由于邮箱开始处有空格而结尾处没有空白字符,所以出现这样的结果。还有就是[^\s]与[\S]的结果是一样的,\s与\S是互反的关系。测试中的点号前面加了反斜杠,由于点号是元字符可以替代任何除了空行以外的所有字符,所有使用反斜杠来对其进行转义来匹配点号,其他元字符用法类似。

一个正则获取woshi和myh0st

测试结果如下:

11.jpg

由于woshi和myh0st之间有几个空行,所以可以用\n和\s匹配空行。\f、\v、\r、\t用法相同。

获取所有链接

测试结果如图:

12.jpg

我们看到有问号,问号是个量词,表示最多一个,也可能不出现。这个就与{0,1}的作用相同了。

获取文字的标签名

测试结果如图:

13.jpg

\1的作用是对前面括号内获取的内容的引用,可以用在处理html页面的时候,获取标签名字的操作。

需要转义的字符

除了上面说的单独出现的元字符,小括号和中括号也需要转义。

关于命名分组

下面看一个例子:

14.jpg

看的出来(?P<year>\d{4})中,可以用尖括号中的名字去获取后面正则匹配出来的数值,这样方便调用,便于记忆。

关于非捕获性括号

这些内容就是我上篇不太懂的地方,下面看个例子来理解一下,如图:

15.jpg

对比两个例子发现,在使用(?:\d+)的时候,只是做了匹配的动作,但是并没有打印出来结果,这就是非捕获型括号的作用,我们在匹配域名的时候就可以使用到,如下:

16.jpg

怎么样?看出区别了吧。

关于捕获型括号

这个东西也不太好懂,我们来看个例子:

17.jpg

从例子中可以看到,<?=...>的作用是获取匹配到正则的地方,使用这个可以在给定的正则前面添加你想要添加的字符串,而<?!...>与之前就正好相反的作用。这个是正序匹配,还有个逆序匹配,如下图:

18.jpg

大家自己体会吧,实在看不懂就去看《正则指引》那本书。

使用正则匹配中文字符

下面看个例子:

19.jpg

从例子看出,汉字在不指定u的时候,打印出来的是多个十六进制串,他将一个汉字分解成两个十六进制,在指定了u之后,出现的是unicode编码格式。

我们就可以用这两种模式去匹配所有中文字符,如下:

20.jpg

关于正则的就写这么多吧,剩下的就靠大家自己了,多写代码多测试,这才是编程的真谛。


本文由 myh0st 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论