资讯专栏INFORMATION COLUMN

[Regular Expression]Mastering Python Regular Expre

daydream / 2009人阅读

摘要:续上基础通俗三类常用的的简写形式偷懒需要用来对某一类特定字符进行匹配,通常,我们用的最多的字符就是下面的三类数字,字母和这类看不到占位符,上一部分学过通过方括号表示这三类的的方法由于上面的表达试比较长,所以需要有一种更简单的写法可以

续上:[Regular Expression]Mastering Python Regular Expression基础通俗(1) 三类常用的metacharacters的简写形式(偷懒需要)
#metacharacters用来对某一类特定字符进行匹配,通常,我们用的最多的字符就是下面的三类
#数字,字母 和 space 	这类看不到占位符,上一部分学过通过方括号表示这三类的metacharacters的方法
[0-9],[a-zA-Z],[ 	

vf]
#由于上面的表达试比较长,所以需要有一种更简单的写法:
 [0-9] 可以写成d
 [a-zA-Z0-9_] 可以写成w
 [ 	

vf] 可以写成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 和进行匹配
对于单词的边界使用,进行匹配,(非单词的边界使用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/hello/p  #这个正则只会把多带带的 hello 这个单词匹配出来
第一章总结:
正则表达式中的主要内容:literal and metacharacters

三个括号的使用:
()与 |搭配使用
[] 单个字符的集合,如[0-9a-z]
{} 属于数量限定符{m,n}

学习了数量限定符: ? * + {}
学习了边界匹配符: ^ $ A   B
学习了常用字符集合的表达方式 [0-9],[0-9a-zA-Z],[  s	
fv] ,取反[^
学习了三类字符的简写式:/s, /d, /w  取反 /S ,/D, /W
点字符 匹配除newline以外的所有单个字符 
注意:上面基础内容,需要经常回顾!!容易遗忘
后面进入Python实战部分:re module的使用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37917.html

相关文章

  • [Regular Expression]Mastering Python Regular Expre

    摘要:续上基础通俗正则表达中两个重要对象如下图使用函数,返回为对象使用函数,如果到存在的结果,则返回对象,否则返回福利一个在线验证自己写的正则表达式是否正确的网站关于正则表达式中的如下图中的前加入字母表明里面的表达式已经是而前面加了,表明,在做之 续上:[Regular Expression]Mastering Python Regular Expression基础通俗(2) 1:Pyth...

    sihai 评论0 收藏0
  • PHP 正则表达式入门 Getting Started with PHP Regular Expre

    摘要:兼容的正则表达式已经实现了很多使用不同解析引擎的正则函数。中主要有两个正则解析器一个称为,另一个称为兼容正则表达式。在中,每个正则表达式模式都是使用符合格式的字符串。 原文链接: Getting Started with PHP Regular Expressions Last-Modified: 2019年5月10日16:23:19译者注: 本文是面向0正则基础的phper, 很多...

    zhangke3016 评论0 收藏0
  • 正则表达式之瑞士军刀

    摘要:瞎乎出品瞎乎第二期正则表达式之瑞士军刀正则表达式,这是一块硬骨头,很难啃,但是啃着又很香。正则表达式使用单个字符串来描述匹配一系列匹配某个句法规则的字符串。 瞎乎 出品瞎乎第二期:正则表达式之瑞士军刀 正则表达式(Regular Expression),这是一块硬骨头,很难啃,但是啃着又很香。 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。很多地方我们都需要使用正...

    Mr_houzi 评论0 收藏0
  • Python中fnmatch模块的使用

    摘要:函数匹配能力介于简单的字符串方法和强大的正则表达式之间,如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。此模块的主要作用是文件名称的匹配,并且匹配的模式使用的风格。 fnmatch()函数匹配能力介于简单的字符串方法和强大的正则表达式之间,如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。此模块的主要作用是文件名称的匹配...

    PAMPANG 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<