匹配可选点的正则表达式

regex to match an optional dot

给定一个结构如下的文件名:

<type>.<unit>.<snip>.<hostname>.<number>.text

其中 snip 是可选文本,可能包含额外的点 但 typeunithostname 等是固定的。

一些例子是:

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 来获取文件名:(this "works")

glob.glob('policies.RoutingPoliciesIx.*router.*.text')
glob.glob('interfaces.InterfacesIxLacp.*router.*.text')

但是,我想要的是在 router 之前的正则表达式中有一个 .(点)。因为 . 之后的内容真正表示路由器主机名。

我试过了,没成功:

glob.glob('policies.RoutingPoliciesIx.*(\.)?router.*.text')

能否请您提供帮助并建议正则表达式应该是什么样子才能解决上述问题?

您需要使用 re.matchre.search

如果名称部分条件是固定的,你可以只使用字符串解析

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'