2017-08-02 128 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