Python正则拆分含多空格、逗号的列表失效,如何实现预期拆分?
正确拆分含多空格分隔但需保留特定空格的字符串
输入数据
Newlist1 = [['66021 4668873364_166638418 3,9202-DC,669251 GEORGIA KS 16.0 55 7 0 1 11/03/22 00:00 11/04/22 23:58 11/03/22 00:01 11/18/22 23:59 11/03/22 09:21 11/03/22 09:21 00:00 00:00 1 0'], ['18202 4819576505_166636826 4,25340414-VNDR,20536331 BRIDGE TOWNSHIP PA 0.0 128 219 0 1 11/03/22 00:00 11/03/22 23:58 11/03/22 00:01 11/14/22 23:59 11/03/22 07:30 11/03/22 07:30 00:00 00:00 1 0 ']]
当前代码问题
原代码通过re.split("\s{2,}", a)按两个以上空格拆分字符串,但无法区分字段内部的单空格(如地名BRIDGE TOWNSHIP、日期时间11/03/22 00:00)和字段之间的单空格(如KS与16.0之间),导致本该保留整体的元素被拆分,而本该分开的字段被合并。
def listToString(s): str1 = "" return (str1.join(s)) output_list = [] for i in NewList1: a= listToString(i) output_list.append(re.split("\s{2,}", a)) final = [x for x in output_list if x]
预期输出
['66021', '4668873364_166638418', '3,9202-DC,669251', 'GEORGIA', 'KS', '16.0', '55', '7', '0', '1', '11/03/22 00:00', '11/04/22 23:58', '11/03/22 00:01', '11/18/22 23:59', '11/03/22 09:21', '11/03/22 09:21', '00:00', '00:00', '1', '0'], ['18202', '4819576505_166636826', '4,25340414-VNDR,20536331', 'BRIDGE TOWNSHIP', 'PA', '0.0', '128', '219', '0', '1', '11/03/22 00:00', '11/03/22 23:58', '11/03/22 00:01', '11/14/22 23:59', '11/03/22 07:30', '11/03/22 07:30', '00:00', '00:00', '1', '0']
解决方案
换用正则匹配而非拆分的思路,优先匹配需要保留整体的元素(日期时间、多单词地名、单独时间),再匹配无空格的普通字段,确保拆分逻辑符合预期。
实现代码
import re Newlist1 = [['66021 4668873364_166638418 3,9202-DC,669251 GEORGIA KS 16.0 55 7 0 1 11/03/22 00:00 11/04/22 23:58 11/03/22 00:01 11/18/22 23:59 11/03/22 09:21 11/03/22 09:21 00:00 00:00 1 0'], ['18202 4819576505_166636826 4,25340414-VNDR,20536331 BRIDGE TOWNSHIP PA 0.0 128 219 0 1 11/03/22 00:00 11/03/22 23:58 11/03/22 00:01 11/14/22 23:59 11/03/22 07:30 11/03/22 07:30 00:00 00:00 1 0 ']] # 正则模式:按优先级匹配日期时间、单独时间、多单词地名、无空格字段 pattern = r'\d{2}/\d{2}/\d{2} \d{2}:\d{2}|\d{2}:\d{2}|[A-Za-z]+(?: [A-Za-z]+)+|\S+' final = [] for sublist in Newlist1: # 去除字符串首尾多余空格 raw_str = sublist[0].strip() # 匹配所有符合规则的元素 elements = re.findall(pattern, raw_str) final.append(elements) # 验证输出 for item in final: print(item)
模式说明
\d{2}/\d{2}/\d{2} \d{2}:\d{2}:匹配xx/xx/xx xx:xx格式的日期时间组合\d{2}:\d{2}:匹配xx:xx格式的单独时间[A-Za-z]+(?: [A-Za-z]+)+:匹配由空格分隔的多单词地名(如BRIDGE TOWNSHIP)\S+:匹配所有无空格的字段(数字、带符号的编码等)
这种方式能精准区分需要保留的单空格和作为分隔符的单空格,完全符合预期输出要求。
内容的提问来源于stack exchange,提问作者Tanwir Khan
相关产品推荐
相关产品推荐

