我想从以下可能的主机名中提取位置:
WebEU01, DBUS01a, LBUS
这将适用于前两个示例:
>>> import re
>>> re.search(r'(.*)(w{2})(d{2})([a-b]?)', 'webeu01').group(2)
'eu'
>>> re.search(r'(.*)(w{2})(d{2})([a-b]?)', 'dbus01a').group(2)
'us'
第三个仅在我将带有数字的组设置为可选时才有效:
>>> re.search(r'(.*)(w{2})(d{2})?([a-b]?)', 'lbus').group(2)
'us'
但这打破了另外两个:
>>> re.search(r'(.*)(w{2})(d{2})?([a-b]?)', 'webeu01').groups()
('webeu', '01', None, '')
是否可以使用单个正则表达式执行此操作,或者我是否需要将其一分为二,然后使用类似any()
您可以使用
r'^(.*?)(w{2})(?:(d{2})([ab]?))?$'
查看正则表达式演示
关键是
- 您需要匹配整个字符串,这意味着您必须在模式周围添加锚点,
^
和$
- 您需要将
d{2}
组设置为可选,因此,添加?
或使用可选的非捕获组包装它。
详
^
- 字符串的开头(.*?)
- 组 1:除换行符字符以外的任何 0+ 字符尽可能少(w{2})
- 两个单词字符(?:(d{2})([ab]?))?
- 可选的非封盖格罗伊普(d{2})
- 第 2 组:任意两位数字([ab]?)
- 第 3 组:可选a
或b
$
- 字符串的结尾。