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

Python如何移除字符串中相邻重复子串并保留首次出现?

解决移除指定子串相邻重复的问题

方法1:使用正则表达式(灵活适配多种分隔场景)

这个方法适合子串之间有任意空白(空格、制表符等)的情况,能一次性合并所有连续重复的指定子串:

import re

s = "USER USER some words USER USER USER words"
substring = "USER"

# 转义子串,避免正则特殊字符(比如.*+等)干扰匹配
escaped_sub = re.escape(substring)
# 正则模式:匹配子串+空白,且后面紧跟着相同子串(正向预查确保是相邻重复)
pattern = rf'({escaped_sub})\s+(?=\1)'
# 替换匹配部分为单个子串,合并连续重复
result = re.sub(pattern, r'\1', s)

print(result)  # 输出: "USER some words USER words"

原理说明:

  • re.escape(substring):转义子串中的正则特殊字符,比如如果子串是"USER.",避免被当成正则通配符。
  • 正则模式({escaped_sub})\s+(?=\1):匹配"子串+一个或多个空白",并且通过(?=\1)正向预查确保后面紧跟的是同一个子串,精准定位相邻重复的子串组合。
  • 替换时把匹配到的"子串+空白"替换为单个子串,从而合并连续重复项。

方法2:使用split+join(简单直观,适合固定空格分隔场景)

如果子串之间仅用空格分隔,用字符串分割和拼接的方法更简洁:

s = "USER USER some words USER USER USER words"
substring = "USER"

# 按子串分割字符串
parts = s.split(substring)
# 过滤掉空字符串或仅含空白的部分
filtered_parts = [part for part in parts if part.strip() != '']
# 用子串拼接过滤后的部分,自动合并连续重复
result = substring.join(filtered_parts)

print(result)  # 输出: "USER some words USER words"

原理说明:

  • s.split(substring)会把原字符串按指定子串切成列表,连续的子串会产生空或仅含空白的元素。
  • 过滤掉这些无效元素后,用子串拼接剩余部分,就能自动将连续重复的子串合并为单个实例。

为什么你之前的尝试没成功?

  • 用sub()时如果只写了匹配两个重复子串的模式(比如rf'{substring}\s+{substring}'),只能处理两两重复的情况,无法覆盖三个及以上连续重复的场景。
  • 用split()时如果没过滤空白元素,直接拼接会导致结果中出现多余的空格或重复子串。

内容的提问来源于stack exchange,提问作者Rudolph Christian Razul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:30:57