Python:regex从主机名中提取位置

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' 第三个选项仅在我将数字组设置为可选

我想从以下可能的主机名中提取位置:

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, '')
是否可以使用单个正则表达式执行此操作,或者是否需要将其拆分为两个,然后使用您可能使用的类似于

的函数进行检查

r'^(.*?)(\w{2})(?:(\d{2})([ab]?))?$'

关键是

  • 您需要匹配整个字符串,这意味着您必须在模式周围添加锚定,
    ^
    $
  • 您需要使
    \d{2}
    组成为可选的,因此,可以添加
    或使用可选的非捕获组将其包装
详细信息

  • ^
    -字符串的开头
  • (.*)
    -第1组:除换行符以外的任何0+字符尽可能少
  • (\w{2})
    -两个字字符
  • (?:(\d{2})([ab]?)?
    -可选的非captruring GROUYUP MSATCH
    • (\d{2})
      -第2组:任意两位数字
    • ([ab]?)
      -第3组:可选的
      a
      b
  • $
    -字符串结束
您可以使用

r'^(.*?)(\w{2})(?:(\d{2})([ab]?))?$'

关键是

  • 您需要匹配整个字符串,这意味着您必须在模式周围添加锚定,
    ^
    $
  • 您需要使
    \d{2}
    组成为可选的,因此,可以添加
    或使用可选的非捕获组将其包装
详细信息

  • ^
    -字符串的开头
  • (.*)
    -第1组:除换行符以外的任何0+字符尽可能少
  • (\w{2})
    -两个字字符
  • (?:(\d{2})([ab]?)?
    -可选的非captruring GROUYUP MSATCH
    • (\d{2})
      -第2组:任意两位数字
    • ([ab]?)
      -第3组:可选的
      a
      b
  • $
    -字符串结束

您希望正则表达式如何处理lbusa?在什么基础上它会知道这样做?位置总是两个字母。您希望正则表达式如何处理
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]?
将模式输入可选的非捕获组,并且只能在数字后匹配。