2014-12-31 43 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. 
    ) 
)