如何使用正则表达式将字符串中连续重复的竖线字符(|)压缩为单个

10次阅读

如何使用正则表达式将字符串中连续重复的竖线字符(|)压缩为单个

本文介绍如何在 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 文本清洗的标准实践之一。

text=ZqhQzanResources