如何移除含重音字符字符串中的相邻重复单词/短语(含标点场景)
如何移除含重音字符字符串中的相邻重复单词/短语(含标点场景)
看起来你需要处理带法语重音字符的字符串,移除连续重复的单字和被逗号分隔的重复短语,之前的正则因为没考虑标点和贪婪模式的问题,只处理了部分情况。我来帮你梳理一个可行的解决方案:
核心思路
我们分两步处理,用循环重复替换确保所有重复都被清理干净(一次替换可能还会残留重复):
- 先清理连续重复的单字(包括被逗号分隔的单字,比如
détaille, détaille) - 再清理被逗号分隔的重复短语(比如
on va, on va、générique l'explication, générique l'explication)
代码实现
import re # 原字符串 original_str = "normalement on on on va, on va diviser, générique générique l'explication, générique l'explication détaille, détaille" # 步骤1:处理连续重复的单字(支持逗号分隔的情况) pattern_single_word = r'(\b[a-zA-ZàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+\b)(?:,\s+|\s+)\1+' # 循环替换直到没有重复 while re.search(pattern_single_word, original_str): original_str = re.sub(pattern_single_word, r'\1', original_str, flags=re.IGNORECASE) # 步骤2:处理被逗号分隔的重复短语(至少两个单词组成) pattern_phrase = r'(\b(?:[a-zA-ZàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+\s+)+[a-zA-ZàâäèéêëîïôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ']+\b)(?:,\s+)\1' while re.search(pattern_phrase, original_str): original_str = re.sub(pattern_phrase, r'\1', original_str, flags=re.IGNORECASE) print(original_str) # 输出结果:normalement on va, diviser, générique l'explication, détaille
正则说明
单字重复处理正则:
(\b[...]+):精准匹配一个带重音的法语单词,\b确保是完整单词(避免匹配单词的一部分)(?:,\s+|\s+):非捕获组,匹配「逗号+空格」或者「单纯空格」,覆盖有无标点的情况\1+:匹配前面捕获的单词重复一次或多次- 循环替换是为了处理三次及以上的重复(比如
on on on需要两次替换才能变成on)
短语重复处理正则:
(\b(?:[...]+\\s+)+[...]+):匹配至少两个单词组成的短语,(?:[...]+\\s+)+匹配「单词+空格」的重复,最后加一个单词确保短语长度(?:,\s+)\1:匹配「逗号+空格」后跟着完全相同的短语,精准处理你案例中逗号后的重复短语
你之前尝试的问题分析
- 第一个正则
r'\b(.+)(\s+\1\b)+用了贪婪模式的.+,会尽可能匹配最长的序列,导致无法精准识别单字重复,还可能错误合并单词 - 第二个正则没有考虑逗号分隔的场景,只能处理无标点的连续重复,所以无法清理
on va, on va这类带标点的短语重复
备注:内容来源于stack exchange,提问作者user3734568
相关产品推荐
相关产品推荐

