2015-10-05 61 views
1

我如何分割線下方。如何找到一個字符的索引空間後,蟒蛇

實施例:

"DHCP discover messages : 20  DNS Requests : 20" 

我想要的輸出使用正則表達式是

['DHCP discover messages', '20', 'DNS Requests', '20' ] 
+0

你怎麼知道在哪裏進行分割?有時候你正在分割空白,有時候在':'(帶有周圍的空白),有時你不會在有空白的時候分割。例如,爲什麼要在'20'和'DNS'之間進行分割,而不是在'DNS'和'Requests'之間進行分割? – ShadowRanger

+1

這也假設介於20和DNS之間的區域不是TAB字符,我認爲... –

+0

這就是它的工作原理。 –

回答

1

如果整條生產線由幾個文字:數字對,先拆應當在每個冒號完成。

然後將除了第一個和最後一個所有部件應在第一空白進行分割。

實施例的輸入字符串:

"t 1 : n1 t t 2 : n2 t t t 3 : n3" 

第一split(':')後:

["t 1 ", " n1 t t 2 ", " n2 t t t 3 ", " n3"] 

split(None, 1)上除了第一所有元素,最後一個後:

["t 1 ", ["n1", "t t 2 "], ["n2", "t t t 3 "], " n3"] 

最後壓平列出並修剪任何額外的空格:

["t 1", "n1", "t t 2", "n2", "t t t 3", "n3"] 

編輯:代碼示例:

def mysplit(line): 
    split1 = line.split(':') 
    last = len(split1) - 1 
    for i, t1 in enumerate(split1): 
     if i == 0 or i == last: 
      yield t1.strip() 
     else: 
      for t2 in t1.split(None, 1): 
       yield t2.strip() 

testline = "t 1 : n1 t t 2 : n2 t t t 3 : n3" 
testsplit = list(mysplit(testline)) 
print(testsplit) 
# prints ['t 1', 'n1', 't t 2', 'n2', 't t t 3', 'n3'] 
+0

非常感謝。這正是我所期待的。 –

+0

嗨,我如何走到最後一步? '[「n1」,「t t 2」]'顯示爲單個元素。但是,我希望它像最後一步那樣分開。除了以** newlist [0] [0] **和'** newlist [0] [1] * * –

+0

@RakeshNittur:你可以搜索「Python list flattening」,它已經被回答了很多次。但是,您可以在創建列表時處理此問題。查看我添加到答案的示例代碼。 – VPfB

1

簡單例子。

print([ 
    (l.strip(), v.strip()) 
    for l, v in re.findall(
     "(?P<label>[^:]+):(?P<value>[ 0-9]+)", 
     example 
    ) 
]) 
[('DHCP discover messages', '20'), ('DNS Requests', '20')] 
+0

OP也想找到匹配的索引(我認爲) – CoryKramer

+0

@CoryKramer「我需要獲取後面的數字」:「。」。 - 他需要的是價值觀,而不是指數。他認爲子串是實現它的唯一方法。 – TkTech

+0

@ TkTech我可以將元素分割到單個列表中嗎? –

2

你可以這樣做:

import re 

str = 'DHCP discover messages : 20  DNS Requests : 20' 

[l.strip() for l in re.sub(r'(\d+) +(\w)', r'\1:\2', str).split(':')] 

#['DHCP discover messages', '20', 'DNS Requests', '20'] 
+0

'l'''''是古老的(在Py2中不推薦使用,而在Py3中不存在),當'l'是'str'時你沒有意義,只要測試'if l'而不與任何東西進行比較空的'str'是虛的,非空的是真的)。此外,踩壞'str'真是糟糕的形式; 'astr','mystr','s';這些都比'str'好(這會影響對'str'構造函數的訪問)。 – ShadowRanger

+0

如果列表理解中的條件稍微好一點的正則表達式以獲得所需的結果,我將其抑制。不過,我提醒你'如果我'! –

1
import re 
x="DHCP discover messages : 20  DNS Requests : 20" 
print [i for i in re.split(r"\s*:\s*\b(\d+\b)\s*",x) if i] 

輸出:['DHCP discover messages', '20', 'DNS Requests', '20']