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

14次阅读

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

本文介绍如何在 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 的批量清洗,是正则处理重复分隔符的标准实践。

text=ZqhQzanResources