续上
:[Regular Expression]Mastering Python Regular Expression基础通俗(1)
三类常用的metacharacters的简写形式(偷懒需要)
#metacharacters用来对某一类特定字符进行匹配,通常,我们用的最多的字符就是下面的三类
#数字,字母 和 space \t这类看不到占位符,上一部分学过通过方括号表示这三类的metacharacters的方法
[0-9],[a-zA-Z],[ \t\n\r\v\f]
#由于上面的表达试比较长,所以需要有一种更简单的写法:
[0-9] 可以写成\d
[a-zA-Z0-9_] 可以写成\w
[ \t\n\r\v\f] 可以写成\s
对上面metacharacters取反的写法分别为 \D ,\W,\S (全部大写即可)
点(dot)字符的使用
-
点这个字符作为一最常用的metacharacter,可以匹配任何一个字符,但是不对newline(换行)进行匹配
举例: g/.../p #这个正则会匹配三个任意字符,但是字符不能为newline 过度使用dot字符,会给阅读带来困难,写正则时,应试尽量做到精确匹配 如需要匹配的字符确定是数字,就使用"\d",而不要选择使用"."
win and 类unix系统中路径分割符的匹配
先看例子:
g/[^\/\]/p
讲解:
^ :这个符号是取反情况的意思
\/ :对 /这个符号进行匹配,(因为 这个/符号本身是需要转义)
\ :对 \进行匹配,
所以上面的正则表达式的意思是:只要不是 / 和 \ 字符,其它的字符都会匹配
在windows系统下路径分割符为:\
在类unix系统下路径分割符为:/
“或”符号(alternatation)的使用方法
想像一下,我们需要把输入文本中“be smart”和"be stupid" 匹配出来,应该怎么写正则呢?
这时应该使用或符号 | 来完成这样的工作:
g/be (smart|stupid)/p #注意还使用了圆括号哦!
g/yes|no|maybe/p #这时会对yes,no,maybe三个单词中的任何一个进行匹配 多个|符号的连用
数量限定符(quantifiers)的使用方法
先记住数量限定符,使用这四个符号:? * + {n,m}
他们的意思分别是:
? : 该符号前面的字符可以出现0个或1个
* : 该符号前面的字符可以出来0个或多个
+ : 该符号前面的字符可以出现1个或多个
{n,m}:该符号前面的字符,最小出现n个,最多出现m个
举例说明就懂了:
来个简单的:
g/carS?/p # 由于?数量限定符,表示前面的字符可以出来0次,或1次,那个这个正则就是在对car 和 carS进行匹配
来个复杂一点的:
如果我们需要对555-555-555 和 555 555 555和 555555555 进行正则匹配
进行正则匹配的意思就是说,我们写的一个正则表达式,可以把上面三种情况都包含在内:
实现如下:
g/\d+[-\s]?\d+[-\s]?\d+/p
解析:
\d是对数字进行匹配,
+号表示前面的数字可以有1个或多个,
[-\s]表示-或space的二个选一个字符的匹配,
?表示前面的字符可以出现0次或1次
由于上面的数字个数是确定的,我们也可以用精确的数字来进行匹配,如下:
g/\d{3}[-\s]?\d{3}[-\s]?\d{3}/p
上面的{3} 表示前面的字符(这里是\d)只能出现三次
对{n,m}进行更多的说明:
{,m}:前面的字符可出现0到m次
{n,}:前面的字符可以出现n到无穷次
由此可知:? * +可以使用{n,m}来表示,只是? * +这样写更省事
? 等价于 {0,1}
* 等价于 {0,}
+ 等价于 {1,}
数量限定的符的两种工作模式 :
通过例子来说明这两种工作模式:
如果我们使用g/".+"/p 正则对下面这句话进行匹配,会得到什么结果?
English "hello" ,Spanish "hola"
很显然,可能会出现两种情况:
情况1: 匹配到结果为: "hello"
情况2: 匹配到结果为: "hello" ,Spanish "hola"
上面两种情况就对应了数量限定符 +,的工作模式
上面的情况2,我们称为Greedy模式 (贪婪模式 )
上面的情况1,我们称为Reluctant模式 (勉强够模式)
python中模式使用的是Greedy模式,如果我们想要使用Reluctant模式,也很容易,只需要在+后面加一个?即可
如下:
g/".+?"/p #在数量限定符+后面添加了?,这时就会使用Reluctant模式
所以在Python中,当你看到有两个数量限定符时,并且第二个限定符为?时,你需要马上知道第二个数量限定符的作用是
表示使用Reluctant模式
对边界进行匹配的metacharacters
思考:对于一个输入文件,我们有什么边界:
1:文本的开头,和文本的结束
2:在文本中行的开头,行的结束
3:单词的边界,(非单词的边界)
对于行的开头和结束,使用^ 和 $进行匹配
对于文件的开关和结束,使用 \A 和\Z进行匹配
对于单词的边界使用\b,进行匹配,(非单词的边界使用\B进行匹配)
举例说明:
g/^name:/p #对文件中 所有行的开始,内容为name: 的行进行匹配
下面的 1,3,4行就满足正则匹配的结果
下面为进行匹配的文本
name:Tom
abc
name:Jim
name:
xxname:abc
来个复杂一点的例子:
g/^name:[\sa-zA-z]+$/p
解释:
看到正则表达式前面后^ $, 就知道行首行尾的内容都要满足要求
以name:开头的行,然后 后面可以接空格或大小写字母, + 代表前面的字符至少要出现1次
最后一个例子(下面两个比较一下):
g/hello/p #这个正则会把hello ,helloxxx,xxhello, xxhelloxx 都匹配出来
g/\bhello\b/p #这个正则只会把单独的 hello 这个单词匹配出来
第一章总结:
正则表达式中的主要内容:literal and metacharacters
三个括号的使用:
()与 |搭配使用
[] 单个字符的集合,如[0-9a-z]
{} 属于数量限定符{m,n}
学习了数量限定符: ? * + {}
学习了边界匹配符: ^ $ \A \Z \b \B
学习了常用字符集合的表达方式 [0-9],[0-9a-zA-Z],[ \s\t\r\n\f\v] ,取反[^
学习了三类字符的简写式:/s, /d, /w 取反 /S ,/D, /W
点字符 匹配除newline以外的所有单个字符
注意:上面基础内容,需要经常回顾!!容易遗忘