
本文介绍如何在 pandas 中利用正则表达式高效地将字段内连续出现的多个竖线 `|` 替换为仅一个,解决因重复分隔符导致的数据解析问题。
在数据清洗过程中,常遇到分隔符被意外重复的情况,例如字符串 '10SGD01AA103||||||10SGD01AA105' 中存在多个连续的竖线 |。若直接用 str.replace('|', '') 会删除所有竖线,而用错误的正则(如 '|(?=|\1+)')则因语法/逻辑错误无法匹配——关键在于:| 是正则中的特殊元字符,必须转义;且要匹配“一个或多个连续的 |”,应使用 \|+。
正确做法是使用 str.replace() 配合原始字符串(r'')和转义后的重复模式:
import pandas as pd
df = pd.DataFrame({'code': ['10SGD01AA103||||||10SGD01AA105||||||10SGD01AA111']})
df['code'] = df['code'].str.replace(r'\|+', '|')
print(df['code'].iloc[0])
# 输出:10SGD01AA103|10SGD01AA105|10SGD01AA111✅ 原理说明:
- r'\|+' 中的 \| 表示字面量竖线(转义避免被解析为“或”逻辑),+ 表示“前面的字符重复一次或多次”;
- 替换目标为单个 '|',因此所有连续 | 序列(如 ||| 或 ||||)均被压缩为一个 |;
- regex=True 是默认行为,可省略,但显式写出更清晰(Pandas 2.0+ 默认启用)。
⚠️ 注意事项:
- 切勿写成 '|+'(未转义)——这会被解释为“空字符串或空字符串”,匹配任意位置,导致意外结果;
- 若需处理其他重复字符(如空格、下划线),只需替换正则中的 \| 为对应转义字符(如 \s+、_+);
- 对于更复杂的去重需求(如仅压缩超过 2 个的重复),可用 r'\|{2,}'(匹配 ≥2 个)替代 \|+。
该方法简洁、高效,适用于全列批量处理,是 Pandas 文本清洗的标准实践之一。










