You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas使用正则仅为长度大于3的字符串第3位插入点号

pandas dx_code字段格式化方案

原有代码问题说明

最初编写的正则存在两个匹配逻辑漏洞:

  1. 负向预查规则仅判断了匹配3个字符后是否到字符串末尾,未覆盖编码存在前后不可见空白、特殊字符的边界场景,会导致部分3位长度编码被误判为长度大于3,末尾被错误加点
  2. 未对第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:18:46