2017-08-02 126 views
4

鑑於分離器的陣列:分割字符串與從陣列(Python)的多個分離

columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 

,並且其中某些列被留下空白的字符串(和有隨機空白):

input = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 

我怎樣才能得到這樣的:

["John", "123:45", "8/2/17", "", "", "i love notes"] 

我已經試過簡單地移除子,看看我可以從那裏,但我小號直到被卡住

import re 
input = re.sub(r'|'.join(map(re.escape, columns)), "", input) 

回答

5

使用列表通過插入在它們之間(.*)以產生正則表達式,然後使用strip刪除空格:

import re 

columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 
s = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 

result = [x.strip() for x in re.match("".join(map("{}(.*)".format,columns)),s).groups()] 

print(result) 

收率:

['John', '123:45', '8/2/17', '', '', 'i love notes'] 

strip部分可以由正則表達式來處理,代價是更復雜的正則表達式,但更簡單的整體表達式:

result = re.match("".join(map("{}\s*(.*)\s*".format,columns)),s).groups() 

更加複雜:如果字段數據中包含正則表達式的特殊字符,我們要逃避他們(而不是在此情況下):

result = re.match("".join(["{}\s*(.*)\s*".format(re.escape(x)) for x in columns]),s).groups() 
+0

出於某種原因,我得到'[ '約翰', '123:45', '17年8月2日' ,'','','']' – almino

+0

編輯,貪婪模式顯然造成了問題。現在修復。 –

3

如何使用re.split

>>> import re 
>>> columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 
>>> i = "Name:  JohnID:123:45Date: 8/2/17Building:Room:Notes: i love notes" 
>>> re.split('|'.join(map(re.escape, columns)), i) 
['', '  John', '123:45', ' 8/2/17', '', '', ' i love notes'] 

爲了擺脫空白,各執空白太:

>>> re.split(r'\s*' + (r'\s*|\s*'.join(map(re.escape, columns))) + r'\s*', i.strip()) 
['', 'John', '123:45', '8/2/17', '', '', ' i love notes'] 
+0

好,可能是OP想到的。但在開始時發佈一個空白的字段。 –

+0

@ Jean-FrançoisFabre開始處的空白字段是因爲您按值「」Name:「分割。它的左邊沒有任何東西,所以它會產生一個空字符串。可能有些東西在左邊。 – Artyer