时间:2021-07-01 10:21:17 帮助过:22人阅读
废话不多说了,先开始最简单的:
'.':可以匹配除换行符以外的任意单个字符(就是个点)。
'*'可以匹配前面的子表达式零次或多次(就是个星号)。
所以上面两个的组合'.*'(点星)就是匹配除换行符以外的所有。
'+':重复一次或更多次。
'?':重复零次或一次。
'\d':匹配一个数字字符。等价于 [0-9]。
'\w'匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
'/s'匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
'^'匹配输入字符串的开始位置。
'$'匹配输入字符串的结束位置。
上面这几个超级常用,当然常用的还有很多,需要的时候请查手册。
这样描述不够直观,直接敲实验。想在Python里使用正则表达式很简单,直接导入re即可:
>>> import re
>>>
先试试匹配所有:
>>> vlan = 'switchport access vlan 612' >>> ljds = re.search('.*',vlan).group() >>> ljds 'switchport access vlan 612'
再试试匹配数字:
>>> ljds = re.search('\d',vlan).group() >>> ljds '6'
因为'/d'是匹配一个数字,所以如果要匹配这里的‘612’,三个数字,可以加上'{3}':
>>> ljds = re.search('\d{3}',vlan).group() >>> ljds
'612'
同理,如果要匹配13个字符(包括空格):
>>> ljds = re.search('[\w\s]{13}',vlan).group() >>> ljds 'switchport ac'
这里还想提一下正则表达式的量词里面涉及到贪婪和非贪婪模式,贪婪就是取最大值,尽可能多的匹配。非贪婪就正好相反(默认是贪婪模式)。举例说明:
刚才上面是匹配13个字符,如果写成匹配2到10个字符就写成:'[\w\s]{2,10}'即可,那么到底匹配的是2个还是10个呢?因为默认是贪婪模式,它会最大的匹配:
>>> ljds = re.search('[\w\s]{2,10}',vlan).group() >>> ljds 'switchport'
在量词后面加个问号'?',就切换到了非贪婪模式,即最小匹配:
>>> ljds = re.search('[\w\s]{2,10}?',vlan).group() >>> ljds 'sw'
接下来介绍一下“捕获”了:
(exp):匹配exp。
(?=exp):匹配exp前面的位置。
(?<=exp):匹配exp后面的位置。
>>> vlan = 'switchport access vlan 612'
最基础的:
>>> ljds = re.search('(access)',vlan).group() >>> ljds 'access'
匹配'access'之前的任意字符:
>>> ljds = re.search('.*(?=access)',vlan).group() >>> ljds 'switchport '
匹配'vlan'之后的任意字符:
>>> ljds = re.search('(?<=vlan).*',vlan).group() >>> ljds ' 612'
OK,学到这里,再看看之前捕获路由器名称的正则表达式:
DeviceName = re.search('.*(?=#show run)',telreply).group()
以上就是Python正则表达式【1】的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!