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

如何利用正则表达式去除字符串中的重复单词(含大小写)?

搞定字符串中大小写不敏感的重复单词移除问题

嘿,我明白你的困扰了——你现在的正则只能处理完全一样、紧紧挨着的重复单词,而且对大小写严格要求,既抓不住Adityapur和ADITYAPUR这种大小写不同的重复项,还可能在某些场景下误操作。咱们一步步来解决这个问题:

核心问题分析

你的正则re.sub(r'\b(\w+)( \1\b)+', r'\1', s)有两个关键局限:

  • 大小写敏感:\1是完全匹配捕获到的内容,所以Adityapur和ADITYAPUR会被当成两个不同的单词,根本匹配不上。
  • 只能处理连续重复:它只能识别test test这种连在一起的重复,像你例子里Adityapur和ADITYAPUR中间隔了Transport colony,它完全看不到。
  • 你说的"误删重复字母",大概率是遇到了类似no no这种连续重复的短单词时,它会直接合并,但这其实是这个正则的设计逻辑——它本来就是用来合并连续重复单词的,只是不符合你的实际需求而已。

解决方案1:移除整个字符串中(非连续)的大小写不敏感重复单词

如果你的需求是整个字符串里,不管大小写,只要是同一个单词,只保留第一次出现的版本,单纯靠正则搞不定,得结合Python的逻辑来记录已经出现过的单词。直接上代码:

import re

original_str = "Q. no. -320/2/2, Road no 25, Adityapur, Transport colony, ADITYAPUR"
seen_words = set()

# 定义回调函数,用来判断是否保留当前单词
def keep_unique(match):
    separator = match.group(1)
    word = match.group(2)
    lower_word = word.lower()
    if lower_word not in seen_words:
        seen_words.add(lower_word)
        return match.group(0)  # 保留原内容(包括分隔符和原大小写的单词)
    else:
        return ''  # 重复单词直接移除

# 匹配带前置分隔符(", ")的单词,同时兼容结尾的单词
pattern = re.compile(r'(, )([A-Za-z]+)(?=, |$)', re.IGNORECASE)
processed_str = pattern.sub(keep_unique, original_str)

# 清理可能留在结尾的多余分隔符
processed_str = re.sub(r', $', '', processed_str)

print(processed_str)
# 输出结果:Q. no. -320/2/2, Road no 25, Adityapur, Transport colony

这个代码的思路是:

  1. 用正则定位所有带, 前缀的单词(符合你示例里的格式)。
  2. 把每个单词转成小写后记录到集合里,确保重复的(不管大小写)只会被保留第一次出现的。
  3. 最后清理掉可能留在字符串末尾的多余, 。

解决方案2:仅处理连续的大小写不敏感重复单词

如果你只需要处理紧紧挨着的重复单词(比如Adityapur ADITYAPUR这种情况),那用带忽略大小写标志的正则就能搞定:

import re

original_str = "Hello hello ADITYAPUR Adityapur test test"
processed_str = re.sub(r'\b(\w+)(?:\s+\1)+\b', r'\1', original_str, flags=re.IGNORECASE)

print(processed_str)
# 输出结果:Hello ADITYAPUR test

这里加了re.IGNORECASE标志,让正则忽略大小写,同时(?:\s+\1)+用来匹配一个或多个空格加重复的单词。

总结

  • 要是需要处理非连续、大小写不敏感的重复,必须结合Python的代码逻辑来跟踪已出现的单词;
  • 要是只处理连续、大小写不敏感的重复,用带忽略大小写标志的正则就足够了。

内容的提问来源于stack exchange,提问作者Abhishek.L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:56:30