用于在Python中重复字符串中的单词的正则表达式

时间:2014-08-24 17:26:18

标签: python regex

我有一个很好的正则表达式来替换字符串中的重复字符。但是现在我还需要替换重复的单词,三个或更多的单词将被两个单词替换。

喜欢

bye! bye! bye!

应该成为

bye! bye!

到目前为止我的代码:

def replaceThreeOrMoreCharachetrsWithTwoCharacters(string): 
     # pattern to look for three or more repetitions of any character, including newlines. 
     pattern = re.compile(r"(.)\1{2,}", re.DOTALL) 
     return pattern.sub(r"\1\1", string)

5 个答案:

答案 0 :(得分:4)

假设所谓的" word"在您的要求中是一个或多个由空格或字符串限制包围的非空格字符,您可以尝试这种模式:

re.sub(r'(?<!\S)((\S+)(?:\s+\2))(?:\s+\2)+(?!\S)', r'\1', s)

答案 1 :(得分:3)

你也可以试试下面的正则表达式,

(?<= |^)(\S+)(?: \1){2,}(?= |$)

示例代码,

>>> import regex
>>> s = "hi hi hi hi some words words words which'll repeat repeat repeat repeat repeat"
>>> m = regex.sub(r'(?<= |^)(\S+)(?: \1){2,}(?= |$)', r'\1 \1', s)
>>> m
"hi hi some words words which'll repeat repeat"

DEMO

答案 2 :(得分:2)

我知道你是在使用正则表达式,但你可以使用一个简单的循环来实现同样的目的:

def max_repeats(s, max=2):
  last = ''
  out = []
  for word in s.split():
    same = 0 if word != last else same + 1
    if same < max: out.append(word)
    last = word
  return ' '.join(out)

作为奖励,我允许指定不同的最大重复次数(默认值为2)。如果每个单词之间有多个空格,则会丢失。无论您认为这是一个错误还是一个功能,都取决于您:)

答案 3 :(得分:1)

尝试以下方法:

import re
s = your string
s = re.sub( r'(\S+) (?:\1 ?){2,}', r'\1 \1', s )

您可以在此处查看示例代码:http://codepad.org/YyS9JCLO

答案 4 :(得分:0)

def replaceThreeOrMoreWordsWithTwoWords(string):
    # Pattern to look for three or more repetitions of any words.
    pattern = re.compile(r"(?<!\S)((\S+)(?:\s+\2))(?:\s+\2)+(?!\S)", re.DOTALL)
    return pattern.sub(r"\1", string)