pandas使用正则仅为长度大于3的字符串第3位插入点号
pandas dx_code字段格式化方案
原有代码问题说明
最初编写的正则存在两个匹配逻辑漏洞:
- 负向预查规则仅判断了匹配3个字符后是否到字符串末尾,未覆盖编码存在前后不可见空白、特殊字符的边界场景,会导致部分3位长度编码被误判为长度大于3,末尾被错误加点
- 未对第4位字符是否为点号做判断,遇到已经带分隔点的编码时,会在前3位后重复插入点,生成双点的错误值
方案1:修正后的正则实现
直接替换原有正则即可,无需改动其他逻辑:
df['formatted_codes'] = df['dx_code'].str.replace( r'^(\w{3})(?!\.|$)', r'\1.', regex=True )
正则逻辑说明:
^(\w{3}):捕获从字符串开头起的3个字母/数字字符作为第一个捕获组(?!\.|$):负向预查约束,只有当前3个字符后既不是字符串末尾、也不是已存在的点号时,才触发替换- 替换内容
\1.为捕获的3个字符后拼接单个点号,不会出现重复加点问题
方案2:无正则的稳妥实现
如果编码规则固定,用字符串切片+判断的写法可读性更强,完全不会出现正则边界匹配异常:
def format_dx_code(code: str) -> str: # 长度≤3、或已包含点号的编码直接返回原值 if len(code) <= 3 or '.' in code: return code # 无点且长度大于3的编码,在第3位后插入点号 return f"{code[:3]}.{code[3:]}" df['formatted_codes'] = df['dx_code'].apply(format_dx_code)
效果验证
两种方案都能完全匹配预期处理结果:
- 3位无点编码:
A00→A00、A01→A01 - 长度大于3无点编码:
A000→A00.0、S92113→S92.113、S92113D→S92.113D - 已带点编码:
A00.1→A00.1、S92.113→S92.113
内容的提问来源于stack exchange,提问作者Siva Rama krishna Kumar
相关产品推荐
相关产品推荐

