Python2.7从无固定分隔符的含换行字符串中提取指定字段
问题描述
需要从字符串textData中提取author、epoch_date、text三个字段,最初尝试用换行符作为字段分隔符,但text字段本身可包含多行内容以及#、空格等特殊字符,直接使用splitlines()方法拆分时,会将text字段内部的换行符也识别为字段分隔符,最终拆分得到5行内容而非预期的3个字段,无法正确完成提取。运行环境限定为Python 2.7,支持调整textData的定义格式,需要最简便的可行实现方案。
原有错误示例的textData定义:
textData="author:john"+"\n"+"epoch_date:53636352"+"\n"+"text:comment on_the_first_line \n line_in_the_middle \n line_at_the_end"
存在问题的拆分代码:
for line in textData.splitlines(): print(line)
可行实现方案
方案1:不修改原有textData格式,通过正则匹配提取
如果不想调整现有textData的生成规则,直接利用三个固定字段的前缀做正则匹配即可,不需要依赖固定分隔符,Python 2.7可直接运行:
import re # 传入re.DOTALL标记让.可以匹配换行符 match_result = re.match( r'author:(?P<author>.*?)\nepoch_date:(?P<epoch_date>.*?)\ntext:(?P<text>.*)', textData, flags=re.DOTALL ) author = match_result.group('author') epoch_date = match_result.group('epoch_date') text = match_result.group('text')
注意:必须传入re.DOTALL匹配标记,否则正则中的.无法匹配换行符,会导致多行的text字段提取不全。
提取结果验证:
author值为johnepoch_date值为53636352text值为完整的多行内容:comment on_the_first_line \n line_in_the_middle \n line_at_the_end
方案2:调整textData分隔规则,使用无冲突分隔符
如果可以调整textData的生成逻辑,选择不会出现在业务内容中的特殊标记做字段分隔符即可,拆分逻辑更简单、性能更高:
# 调整后的textData定义,也可以用ASCII控制字符\x1e(标准记录分隔符,普通文本不会出现)做分隔符,可靠性更高 textData = "author:john" + "|||FIELD_SPLIT|||" + "epoch_date:53636352" + "|||FIELD_SPLIT|||" + "text:comment on_the_first_line \n line_in_the_middle \n line_at_the_end" # 拆分逻辑,split第二个参数传1表示只按第一个冒号拆分,避免字段内容里包含冒号导致解析错误 author_part, epoch_part, text_part = textData.split("|||FIELD_SPLIT|||") author = author_part.split(":", 1)[1] epoch_date = epoch_part.split(":", 1)[1] text = text_part.split(":", 1)[1]
方案3:使用结构化序列化格式(长期维护最稳妥)
如果后续可能新增字段、字段内容复杂度高,直接用Python 2.7内置支持的结构化格式存储,完全不用考虑分隔符冲突问题,比如JSON:
import json # 生成textData阶段直接序列化 textData = json.dumps({ "author": "john", "epoch_date": 53636352, "text": "comment on_the_first_line \n line_in_the_middle \n line_at_the_end" }) # 提取阶段直接反序列化 data = json.loads(textData) author = data['author'] epoch_date = data['epoch_date'] text = data['text']
该方案扩展性最好,哪怕字段内容包含任意特殊字符(换行、特殊符号、多语言内容)都不会出现解析错误,数值类型字段还可以自动保留类型,不需要额外做类型转换。
内容的提问来源于stack exchange,提问作者vel
相关产品推荐
相关产品推荐

