使用数组中的多个分隔符拆分字符串(Python)

使用数组中的多个分隔符拆分字符串(Python),python,split,delimiter,Python,Split,Delimiter,给定一组分隔符: columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"] 以及一个字符串,其中某些列留空(并且有随机空白): 我怎样才能得到这个: ["John", "123:45", "8/2/17", "", "", "i love notes"] 我试着简单地删除子字符串,看看我能从那里走到哪里,但我仍然被卡住了 import re input = re.sub(r'|'.join(map(re.escap

给定一组分隔符:

columns = ["Name:", "ID:", "Date:", "Building:", "Room:", "Notes:"]
以及一个字符串,其中某些列留空(并且有随机空白):

我怎样才能得到这个:

["John", "123:45", "8/2/17", "", "", "i love notes"]
我试着简单地删除子字符串,看看我能从那里走到哪里,但我仍然被卡住了

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

使用列表通过在中间插入
(.*)
生成正则表达式,然后使用
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()
更复杂的是:如果字段数据包含regex特殊字符,我们必须对其进行转义(这里不是这种情况):

使用如何

要除去空白,请也拆分空白:

>>> 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']

很好,也许是OP的想法。但是在开始时发出一个空字段。@Jean-Françoisfar开始时的空字段是因为您按值
“Name:”
进行了拆分。它的左边没有任何内容,因此它是一个空字符串。可能是左边的东西。出于某种原因,我正在编辑
['John','123:45','8/2/17','','',''']
,贪婪模式显然造成了问题。现在修好了。
result = re.match("".join(["{}\s*(.*)\s*".format(re.escape(x)) for x in columns]),s).groups()
>>> 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']