匹配可选点的正则表达式
regex to match an optional dot
给定一个结构如下的文件名:
<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
来获取文件名:(this "works")
glob.glob('policies.RoutingPoliciesIx.*router.*.text')
glob.glob('interfaces.InterfacesIxLacp.*router.*.text')
但是,我想要的是在 router
之前的正则表达式中有一个 .
(点)。因为 .
之后的内容真正表示路由器主机名。
我试过了,没成功:
glob.glob('policies.RoutingPoliciesIx.*(\.)?router.*.text')
能否请您提供帮助并建议正则表达式应该是什么样子才能解决上述问题?
您需要使用 re.match
或 re.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'
给定一个结构如下的文件名:
<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
来获取文件名:(this "works")
glob.glob('policies.RoutingPoliciesIx.*router.*.text')
glob.glob('interfaces.InterfacesIxLacp.*router.*.text')
但是,我想要的是在 router
之前的正则表达式中有一个 .
(点)。因为 .
之后的内容真正表示路由器主机名。
我试过了,没成功:
glob.glob('policies.RoutingPoliciesIx.*(\.)?router.*.text')
能否请您提供帮助并建议正则表达式应该是什么样子才能解决上述问题?
您需要使用 re.match
或 re.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'