
本文介绍如何在 pandas 中使用正则表达式高效地将字段内连续出现的多个竖线 `|` 替换为单个竖线,解决分隔符冗余问题。
在数据清洗过程中,常遇到因格式异常或拼接错误导致的重复分隔符问题,例如字符串 '10SGD01AA103||||||10SGD01AA105' 中存在多个连续竖线 |。目标是将其规范化为 '10SGD01AA103|10SGD01AA105' ——即把两个及以上连续的 | 替换为单个 |。
正确做法是使用 str.replace() 配合正则表达式 r'\|+':
import pandas as pd
df = pd.DataFrame({'code': ['10SGD01AA103||||||10SGD01AA105||||||10SGD01AA111']})
df['code'] = df['code'].str.replace(r'\|+', '|', regex=True)
print(df['code'].iloc[0])
# 输出:10SGD01AA103|10SGD01AA105|10SGD01AA111✅ 关键说明:
- r'\|+' 是原始字符串(raw string),其中 \| 表示字面量竖线(因 | 在正则中是特殊元字符,必须转义),+ 表示“一个或多个连续匹配”;
- 第三个参数 regex=True(Pandas 1.3+ 默认为 True,但显式声明更稳妥)确保启用正则引擎;
- 替换目标为普通字符 ' | ',无需转义。
⚠️ 常见错误分析:
- '|(?=|\1+)' 和 '|(?=|)' 语法不合法:(?=...) 是正向先行断言,但 | 在其中未转义且逻辑混乱,\1 引用未定义的捕获组,会导致 re.error 或无效果;
- 直接写 '|+' 不加转义 → 被解释为“空字符串或空字符串”,即逻辑或,完全失效;
- 忘记 regex=True(旧版 Pandas 默认 False)→ 触发普通字符串替换,'|+' 被当作字面量查找,无法匹配。
? 扩展提示:若需同时处理首尾冗余分隔符,可链式调用:
df['code'] = (df['code']
.str.replace(r'\|+', '|', regex=True)
.str.strip('|')) # 去除开头和结尾的 |该方法简洁、高效,适用于大规模 DataFrame 的批量清洗,是正则处理重复分隔符的标准实践。










