python re 正则匹配,python re包的作用

  python re 正则匹配,python re包的作用

  本文主要介绍了python中正则表达式re包的简单引用方法,具有很好的参考价值。希望对大家有帮助。如有错误或不足之处,请不吝赐教。

  00-1010正则表达式re包的简单引用。Match(模式,字符串,标志=0) II。re.search(模式,字符串,标志=0) III。re()IV的检索和替换。正则表达式的命名捕捉re库的正确使用姿势为什么要使用姿势应用示例

  

目录

 

  正则表达式一直被我忽视,因为在之前的研究开发中很少用到。更有甚者,之前学正则表达式的时候,觉得自己很笨,就毅然放弃了(QAQ)。但是,我还是要还的。最近日志处理要用到正则表达式,这让我不得不拿起正则表达式。在这里,记录一些我自己学习的笔记和案例。

  在python中导入re包

  进口re

  

对正则表达式re包的简单引用

 

  试着从字符串开始(看清楚,起始位置!)匹配一个模式。则成功返回一个匹配对象,如果失败则不返回任何对象。

  参数说明:

  模式:正则表达式字符串:字符串标志:可选标志注意:可选标志简述如下。

  获取对象的方法:

  使用group(num)获取对象组中的内容。

  举例:

  #_*_coding:utf8_*_

  进口re

  str1=010-011-110

  pattern=rd{3}-d{3}-d{3}

  match=re.match(模式,str1)

  打印match.group()

  打印匹配组(0)

  打印匹配组(1)

  打印匹配组(2)

  打印匹配组(3)

  #输出为3360

  010-011-110

  010-011-110

  010

  011

  110

  match()方法最重要的一点是它从字符串中进行匹配。请记住这一点。在这一点上我犯了很多错误。

  在编写简单的正则表达式时,我们可以使用()对其进行分组,以便在后续的处理中获取值。后面我们还会讲到通过命名捕获的方式取值。

  

一、re.match(pattern,string,flags=0)

 

  与match函数参数一样,它也用于匹配字符串。最大的区别在于,它可以匹配字符串中的任何位置,而不像match只限于字符串的开头。参数和match一样,就不解释了。让我们直接看例子。

  #与match示例不同,001前面有许多空格。

  str1= 001-010-110

  #与匹配中的模式相同

  pattern=rd{3}-d{3}-d{3}

  #如果此时使用match()函数,结果肯定不匹配。

  search=re.search(模式,str1)

  打印search.group()

  打印搜索组(0)

  打印搜索组(1)

  打印搜索组(2)

  打印搜索组(3)

  #结果:

  001-010-110

  001-010-110

  001

  010

  110

  对于匹配和搜索,我们不得不说一遍。注意,一个必须从字符串的开头开始匹配,另一个必须在任何地方匹配。

  

二、re.search(pattern,string,flags=0)

 

  用于替换字符串中的匹配项。

  re sub(patte

  rn,repl,string,count,flags)

  参数说明:

  

  • pattern:正则表达式

  • repl:替换的字符串,可为一个函数

  • string:要被查找的原始字符串

  • count:被替换的次数,默认替换所有匹配项

  • flags:标志位

 

  

#_*_coding:utf-8_*_

 

  sub函数理解起来不难,但要主要的是在repl参数的使用。repl可以为一个函数。例如:

  将字符串中的数字乘以二

  

def double(match):

 

  因为repl为一个函数,所以再替换的时候会替换为函数的返回值。

  注:?P<value>为正则表达式的命名捕获,在下面将会做简单记录

  

 

  

四、正则表达式之命名捕获

 

  格式为:?P<name>

  在处理字符串取值时往往会用到

  例子:

  

num = 001-010-110

 

  在上述例子要分别获取每项的值就要使用group(num),而当正则表达式变得复杂的时候,再用num取值时,很有可能会取到错误的值。所以就提出使用命名捕获,下面为简单例子:

  

pattern = r(?P<Area>d{3})-(?P<zhong>d{3})-(?P<wei>d{3})

 

  虽然在上述例子中使用命名捕获会将降低正则表达式的可读性,但命名捕获咋复杂的正则中,会准确获取想要的值(当然,正则肯定得写准确啊·····)

  

 

  

re库的正确使用姿势

 

  前提假设:

  

  • 已经充分掌握PCRE风格正则表达式

  • 熟读re库文档

 

  

 

  

Why

 

  正则表达式的强大已不用我赘述,Python 对此的支持也是十分强大,只不过:

  

re.search(pattern, string, flags=0)

 

  你能很麻利地使用如上所示的一系列模块级别function 吗,如果你天天用 Python 搞正则匹配,相信你一定很熟练。但是如果你需要每次临时翻阅文档才能知道如何使用它,那么就要思考:是不是 API 在某种程度上设计不好了(有的语言的 pattern 极有可能不是放在首位)。

  一般来说,API 的接口参数越少越好,最好的就是没有参数,调用者无脑调用,没有任何记忆负担。而 Python 的 re 库,在我看来,应该至少糅合了「命令式」与「OOP」两种风格,而且接口也不「最小化,正交」。

  

 

  

使用姿势

 

  正确的姿势应该是:只用 OOP 风格,并且完全忘记 re 库提供的一系列模块级别的 function (如 re.search, re.match等)。

  首先是每次都构造出 Regex 对象,然后由 Regex 对象得出 Match 对象,然后在 Regex 对象和 Match 对象上进行一系列操作。比如:

  

# 1. 构造

 

  

 

  

应用举例

 

  比如我在自己构造的 PathUtils 中,就是如此使用的(我非常喜欢各种各样的 Utils ):

  

from __future__ import (absolute_import, unicode_literals)

 

  主要的功能函数就是:

  

@classmethod

 

  这样一系列流程下来,我的感受就是,re 库的接口没有需要记忆,也没有需要临时翻阅文档的地方,并且我只用这一种风格(自己熟悉的,效率总是最高的),比如 re.compile肯定只需要传一个参数(flags不是必要的),REGEX_OBJ.match/search肯定只需要传need_search_string即可。

  以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: