Python:regex从主机名中提取位置
我想从以下可能的主机名中提取位置: webeu01、dbus01a、lbus 这将适用于前两个示例:Python:regex从主机名中提取位置,python,regex,Python,Regex,我想从以下可能的主机名中提取位置: 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' 第三个选项仅在我将数字组设置为可选
>>> 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, '')
是否可以使用单个正则表达式执行此操作,或者是否需要将其拆分为两个,然后使用您可能使用的类似于的函数进行检查
r'^(.*?)(\w{2})(?:(\d{2})([ab]?))?$'
见
关键是
- 您需要匹配整个字符串,这意味着您必须在模式周围添加锚定,
和^
$
- 您需要使
组成为可选的,因此,可以添加\d{2}
或使用可选的非捕获组将其包装?
-字符串的开头^
-第1组:除换行符以外的任何0+字符尽可能少(.*)
-两个字字符(\w{2})
-可选的非captruring GROUYUP MSATCH(?:(\d{2})([ab]?)?
-第2组:任意两位数字(\d{2})
-第3组:可选的([ab]?)
或a
b
-字符串结束$
r'^(.*?)(\w{2})(?:(\d{2})([ab]?))?$'
见
关键是
- 您需要匹配整个字符串,这意味着您必须在模式周围添加锚定,
和^
$
- 您需要使
组成为可选的,因此,可以添加\d{2}
或使用可选的非捕获组将其包装?
-字符串的开头^
-第1组:除换行符以外的任何0+字符尽可能少(.*)
-两个字字符(\w{2})
-可选的非captruring GROUYUP MSATCH(?:(\d{2})([ab]?)?
-第2组:任意两位数字(\d{2})
-第3组:可选的([ab]?)
或a
b
-字符串结束$
lbusa
?它凭什么知道这样做?位置总是两个字母。谢谢。它工作得很好,但如果最后一个组中的任何字母匹配,则会出现一个极端情况,例如gb
:>>re.search(r'^(.*)(\w{2})(((?:\d{2}))([ab]?)$,'lbgb')。groups()('l','bg','b')
@HTF那么您想如何界定捕获?它们的规格是什么?请尝试^(.*?)(\w{2})(?:(\d{2})([ab]?)?$
,请参阅。这些是唯一可能的选项webeu01、dbus01a、lbus
,但位置可以是gb
,所以`webgb01、dbgb01a、dbgb01b、lbgb`都是possible@HTF好的,我包括了[ab]?
将图案放入可选的非捕获组,只能在数字后匹配。谢谢。它工作得很好,但如果最后一个组中的任何字母匹配,则会出现一个极端情况,例如gb
:>>re.search(r'^(.*)(\w{2})(((?:\d{2}))([ab]?)$,'lbgb')。groups()('l','bg','b')
@HTF那么您想如何界定捕获?它们的规格是什么?请尝试^(.*?)(\w{2})(?:(\d{2})([ab]?)?$
,请参阅。这些是唯一可能的选项webeu01、dbus01a、lbus
,但位置可以是gb
,所以`webgb01、dbgb01a、dbgb01b、lbgb`都是possible@HTF好的,我包括了[ab]?
将模式输入可选的非捕获组,并且只能在数字后匹配。