2014-12-31 44 views
1

我有一个像蟒蛇拆分字符串时,关键字来的模式

ab-test-db-dev.0002-colo1-vm234.abc.domain.com 

一个主机名后(是没有约定内部遵循的主机名。)

我尝试这个主机拆分

ab-test-db-dev.0002-colo1-vm234 

图案与分裂“”,但前提是有以下这点没有其他特殊字符。

我试图

pattern = domain.split(".") 

但只服用,直到

ab-test-db-dev and not ab-test-db-dev.0002-colo1-vm234 

为第一要素。

什么是实现这一目标的最佳途径?

+2

定义*没有其他特殊字符*在这里。你的意思是你想拆分包含破折号和数字的名称的任何部分? –

+0

您可能想要使用'hostname -s'。从'man hostname' - >'显示短主机名。这是在第一个点处切割的主机名' – fedorqui

+0

@fedorqui:不,这会给'ab-test-db-dev'。代替。 –

回答

2

您可以删除第一部分,直到不再有破折号;那会是域名从主机名中删除:

hostname = domain 
while '-' in domain: 
    domain = domain.partition('.')[-1] 
hostname = hostname[:-len(domain) - 1] 

或周围的其他方法,除去最后一部分,如果它包含破折号,与str.rpartition()

hostname = domain 
while True: 
    first, _, end = hostname.rpartition('.') 
    if '-' in end: 
     break 
    hostname = first 

使用正则表达式寻找一个只包含字母和点任何部分:

import re 

hostname = re.sub(r'\.[a-z.]+$', '', domain) 

演示:

>>> domain = 'ab-test-db-dev.0002-colo1-vm234.abc.domain.com' 
>>> hostname = domain 
>>> while '-' in domain: 
...  domain = domain.partition('.')[-1] 
... 
>>> hostname[:-len(domain) - 1] 
'ab-test-db-dev.0002-colo1-vm234' 
>>> domain = 'ab-test-db-dev.0002-colo1-vm234.abc.domain.com' 
>>> hostname = domain 
>>> while True: 
...  first, _, end = hostname.rpartition('.') 
...  if '-' in end: 
...   break 
...  hostname = first 
... 
>>> hostname 
'ab-test-db-dev.0002-colo1-vm234' 
>>> import re 
>>> re.sub(r'\.[a-z.]+$', '', domain) 
'ab-test-db-dev.0002-colo1-vm234' 
+0

那么有没有办法,从最后一个字符串拆分? – pkill

+0

@pkill:是的,有'str.rpartition()'和'str.rsplit()'限制。我在回答中使用第一个。 –

+0

决定使用最后一个正则表达式re.sub。非常感谢Martijin。 – pkill

0

如果我理解正确你的问题,那么这个正则表达式应该做的工作:

.*?(?=\.(?!.*[^\w.]))

>>> print re.match(r'.*?(?=\.(?!.*[^\w.]))', 'ab-test-db-dev.0002-colo1-vm234.abc.domain.com') 
ab-test-db-dev.0002-colo1-vm234 

说明:

.*? # match everything up to... 
(?= 
    \. # the first dot... 
    (?! # that isn't followed by... 
     .* # any text and... 
     [^\w.] # something that's not a word character or a dot. 
    ) 
)