[zz]python 正则表达式

python 正则表达式

https://www.cnblogs.com/mengyu/p/6638257.html

 最近需要从日志中解析一些业务数据,因为日志中的数据大部分是不规范,所以我这边首先考虑通过正则表达式的方式来解析日志中的数据。

Python 自1.5版本起增加了re 模块,而笔者目前使用的python 3.5.1,下面简单的介绍一下 re.compile,re.match,re.search,re.findall方法,暂时还有一些例如re.sub,re.split等比较常用的方法暂时就不在这里介绍,有兴趣的可以大家一起来探讨学习。

re.compile语法:

1

2

compile(pattern, flags=0)

  Compile a regular expression pattern, returning a pattern object.

 re.compile 函数根据一个正则表达式的字符串生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

参数描述

pattern正则表达式

flags标记位,用于控制正则表达式的匹配方式




举个例子:

1PATTERN_MATCH = re.compile(r'\d') #\d 匹配数字

  re.match语法

match(pattern, string, flags=0)

        Try to apply the pattern at the start of the string, returning a match object, orNoneifno match was found.

  re.match 尝试从字符串的起始位置匹配,如果不是起始位置匹配成功的话,match()就返回None


参数描述

pattern正则表达式

string匹配的字符串

flags标记位,用于控制正则表达式的匹配方式





string ='[order]-2017-03-28 00:41:10,200 [SimpleAsyncTaskExecutor-26] INFO  c.c.t.t.o.t.t.OrderSubmitTransition - 订单[20170328003706846400696981925888]出票结束,返回结果[true]'#首先匹配中间字符,不匹配开头字符串match = re.match(r'\d{32}',string)if match:

    print('匹配订单号:',match.group())#匹配开头字符串match =  re.match(r'\[\w+\]',string)if match:

    print('匹配APP名称:',match.group())

  re.search语法

search(pattern, string, flags=0)

  Scan through string looking for a match to the pattern, returning a match object, orNoneifno match was found.

  re.search 扫描整个字符串并返回第一个成功的匹配,如果有多个符合,那也只能匹配到第一个。

  参数类型与match一致,这里详细说明


string = '[order]-2017-03-28 00:41:10,200 [SimpleAsyncTaskExecutor-26] INFO c.c.t.t.o.t.t.OrderSubmitTransition - 订单[20170328003706846400696981925888]出票结束,返回结果[true]'

search

= re.search(r'\d{32}',string)if match:

    print('匹配订单号:',search.group())#匹配[]中的字符串search =  re.search(r'\[\w+\]',string) #[order],[20170328003706846400696981925888]和[true] 均满足,但是匹配到[order]时已经结束;

ifsearch:

  print('匹配[]中的数据:',search.group())

  re.findall 语法

findall(pattern, string, flags=0)

        Return a list of all non-overlapping matchesin the string.


        If one ormore capturing groups are presentinthe pattern,return        a list of groups; this will be a list of tuples ifthe pattern        has more than one group.

Empty matches are included

inthe result.

  re.findall 扫描整个字符串以列表形式返回全部能匹配的子串,这里findall 就会弥补了re.search的缺点。

string ='[order]-2017-03-28 00:41:10,200 [SimpleAsyncTaskExecutor-26] INFO  c.c.t.t.o.t.t.OrderSubmitTransition - 订单[20170328003706846400696981925888]出票结束,返回结果[true]'findall =  re.findall(r'\[\w+\]',string)if search:

    print('匹配[]中的数据:',findall)

到这里我就将re常用的几个匹配模式讲解完成,这里仅代表自己的见解和理解,同时也参考多个文章,对这几个方法的使用进行加深,如果有问题请大家指正,共同进步。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。