给出的文件名结构如下:
<type>.<unit>.<snip>.<hostname>.<number>.text
其中snip
是可选文本,可能包含多余的点
但是type
,unit
,hostname
等是固定的。
一些例子是:
interfaces.InterfacesIxLacp.router.001.text
policies.RoutingPoliciesIx.BOGONS-EXT-V6-in.router.002.text
我想匹配以下文件名: 文字
问题是<dot><snip><dot>
取决于<snip>
的存在,第二个是可选的。
在上面的示例中,snip
等于BOGONS-EXT-V6-in
。
可以同时考虑这两种情况的通用正则表达式是什么?
我正在使用Python标准库中的glob
来获取文件名:(此“有效”)
glob.glob('policies.RoutingPoliciesIx.*router.*.text')
glob.glob('interfaces.InterfacesIxLacp.*router.*.text')
但是,我想在.
之前的正则表达式中包含router
(点)。 .
之后的内容真正表示路由器主机名。
我尝试了这个,但是失败了:
glob.glob('policies.RoutingPoliciesIx.*(\.)?router.*.text')
您能否提供帮助并建议正则表达式的外观以解决上述问题?
答案 0 :(得分:0)
您需要改用re.match
或re.search
。
答案 1 :(得分:0)
如果名称部分条件固定,则可以使用字符串解析
filename1 = 'policies.RoutingPoliciesIx.BOGONS-EXT-V6-in.router.002.text'
filename2 = 'interfaces.InterfacesIxLacp.router.001.text'
first1 = filename.split('.')[:2]
last1 = filename.rsplit('.', maxsplit=3)[1:]
first2 = filename2.split('.')[:2]
last2 = filename2.rsplit('.', maxsplit=3)[1:]
>>>> first1
['policies', 'RoutingPoliciesIx']
>>>> last1
['router', '002', 'text']
>>>> filename1 = '.'.join(first) + '.'.join(last)
>>>> filename1
'policies.RoutingPoliciesIxrouter.router.002.text'
>>>> filename2 = '.'.join(first) + '.'.join(last)
>>>> filename2
'interfaces.InterfacesIxLacprouter.router.001.text'