Python文本匹配,匹配内容跨多行

来源:互联网 发布:rest jsp PHP 编辑:程序博客网 时间:2024/05/22 04:53

    刚开始用Python,不知道如何学习,在主管鑫哥的指导下,我从昨天下午直到今天早上开始研究了下Python的正则表达式,目的是在一段文本中找出匹配内容。

    文本截取一段如下。

p18p1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.56.104  netmask 255.255.254.0  broadcast 172.17.57.255
        inet6 fe80::1e6f:65ff:feda:19c8  prefixlen 64  scopeid 0x20<link>
        ether 1c:6f:65:da:19:c8  txqueuelen 1000  (Ethernet)
        RX packets 141525  bytes 68071814 (64.9 MiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 78944  bytes 8024469 (7.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 3  collisions 0

         ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULT

ICAST>
   dfs
         ds inet 11.1.1.13  netmask 255.255.255.255  destination 11.1.1.1
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 3850  bytes 718976 (702.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4442  bytes 351187 (342.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

需要匹配的内容是ppp0...inet 11.1.1.13。



    下面是研究的过程。

    开始使用match()来匹配,但是总是出现问题,后来发现match()应该是只匹配一行的语句,在网上查了半天,发现如果用match()还要加循环逐行搜索,而且我要匹配的内容要跨多行,最后没有用match()验证。在Python的官网查了查,发现了一个search()函数,可以多行匹配。



最后程序如下

import re
str='''   上面的 文本    '''

c='ppp0.+(\s|\S){0,}.*inet +((\d{1,3}.){3}\d{1,3})'

match1=re.search(c,str)
print match1
result=match1.group()
print result


    结果如下

[root@localhost bypdhu]# python b.py
<_sre.SRE_Match object at 0xb7739f20>
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULT

ICAST>
   dfs
         ds inet 11.1.1.13


    可以看出来,内容被匹配出来了。


    下面是对程序的具体的分析,刚写Python,很多不太懂,都要写出来便于以后翻阅。

    首先要导入re模块,利用re模块的search函数。然后将文本赋给str,如果是一个*.txt等文件也是一样赋给str,然后写出要匹配内容的正则表达式,这个是最重要的。然后就可以使用search()来匹配了。

    正则表达式介绍。这个正则表达式  c='ppp0.+(\s|\S){0,}.*inet +((\d{1,3}.){3}\d{1,3})'  写了好久,最终试验成功。

    首先要找以ppp0开头的,.表示任意非\n的字符,+表示匹配前一个字符一次到无限次,这样.+就可以表示最多一行的内容;然后在Python中,\s可以表示空白字符,空格\t\n\r\v\f,\S可以表示非空白字符,|是或语句,这样(\s|\S)就能表示一段空白字符或非空白字符的原子,后面跟着{0,},表示这样的原子有0到无限个,这样就可以表示中间的多行;.*inet 表示inet前的任意字符有0到无限个,后面还跟着一个空格;最后((\d{1,3}.){3}\d{1,3}),\d{1,3}表示一到三位数字,(\d{1,3}.){3}表示一到三位数字再加一个.重复三次,后面再跟一个一到三位的数字。

    完成一个小任务真的很开心啊,尽管东西少,也很简单,但对于我这个初学者来说真的非常高兴。

    还有不知道真正用的时候search和match的区别,这个以后再说吧。

参考网址:

https://docs.python.org/2/library/re.html#module-re

http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

0 0
原创粉丝点击