鉴于此清单:
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']
我想在空格上拆分+1 -111
,-1 +103
以获得结果:
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']
这是我需要的正则表达式:
(?<=\d)\s(?=[-+]\d\d\d)
但显然我不知道如何将它应用到列表中。显然,切片的解决方案,如拆分总是列表的nth
元素是不受欢迎的选项。我更喜欢这样做更有效率。
答案 0 :(得分:2)
使用现有的re
,您可以使用以下内容展平单个元素拆分:
import re
from itertools import chain
some_list = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']
print list(chain.from_iterable(re.split('(?<=\d)\s(?=[-+]\d\d\d)', s) for s in some_list))
# ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']
答案 1 :(得分:1)
不确定这是否是最有效的方式,但是:
output = []
for x in input:
if re.search('(?<=\d)\s(?=[-+]\d\d\d)', x):
output += x.split(" ")
应该有用。
答案 2 :(得分:1)
以下是使用列表推导的一个选项:
import re
lst = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1 -111', '-1 +103', u'91', u'93']
result = [s for x in lst for s in re.split(r'(?<=\d)\s(?=[-+]\d\d\d)', x)]
结果:
>>> result
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1', '+103', u'91', u'93']
或者修改列表:
for i in range(len(lst)-1, -1, -1):
lst[i:i+1] = re.split(r'(?<=\d)\s(?=[-+]\d\d\d)', lst[i])
请注意,从列表末尾到前面的循环非常重要。
答案 3 :(得分:1)
使用生成器可以非常高效,特别是对于大量输入,如果您想在迭代后丢弃结果(并且比使用中间列表更优雅):
def split_elements(list_, regex):
for element in list_:
for sub_element in re.split(regex, element):
yield sub_element
output = [x for x in split_elements(input, regex)]
对于样本输入:
>>> l = ['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM',
'+1 -111', '-1 +103', u'91', u'93']
>>> list(split_elements(l, r'(?<=\d)\s(?=[-+]\d\d\d)'))
['MIA', 'BOS', '08:17 AM', '-107', '-103', '08:17 AM', '+1', '-111', '-1',
'+103', u'91', u'93']
这几乎与Jon Clements的答案中使用的技术相同,没有itertools(几周后单行可能难以阅读)。