刚开始用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