如何使用正则按用户维度提取data dump中IFSC等字段生成结构化数据
实现方案
你可以通过单用户块匹配的方式避免列表错位问题,有两种常用实现方式:
方案1:正则一次性捕获(效率更高,适合字段完整度高的场景)
直接通过带捕获组的正则匹配单个用户的所有关联字段,代码如下:
import re # 你的原始数据 raw_content = """ 00~XXXXXXXXXXXXXX24~ 01~John~Doe~Bank~Name~XXXXXXX00~ABCD0123456~ 其他非必要数据 00~XXXXXXXXXXXXXX23~ 01~Jane~Doe~Bank~Name~XXXXXXX00~ABCD0123456~ 其他非必要数据 """ user_pattern = re.compile( r"00~(\d{16})~.*?01~.*?Bank~Name~(\d{9})~([A-Z]{4}0[A-Z0-9]{6})~", flags=re.DOTALL # 支持跨行匹配 ) output = [] for match in user_pattern.finditer(raw_content): demat, micr, ifsc = match.groups() output.append({ "demat_id": demat, "micr_code": micr, "ifsc_code": ifsc })
方案2:分块单独匹配(容错性更高,适合存在字段缺失的场景)
先按用户数据边界拆分内容,再对每个用户块单独匹配字段,缺失字段默认赋值为None:
import re raw_content = """你的原始数据""" output = [] # 按00开头的用户标识拆分所有用户块 user_blocks = re.split(r"(?=00~\d{16}~)", raw_content) for block in user_blocks[1:]: # 跳过拆分出来的空首元素 # 逐个匹配字段,不存在则留空 demat = re.search(r"00~(\d{16})~", block) micr = re.search(r"Bank~Name~(\d{9})~", block) ifsc = re.search(r"[A-Z]{4}0[A-Z0-9]{6}", block) output.append({ "demat_id": demat.group(1) if demat else None, "micr_code": micr.group(1) if micr else None, "ifsc_code": ifsc.group(0) if ifsc else None })
两种方案最终输出的output都是字典组成的列表,每个字典对应一个用户的关联信息,不会出现字段错位的问题。
内容的提问来源于stack exchange,提问作者Nipun
相关产品推荐
相关产品推荐

