删除连续特定单词的重复

时间:2018-02-16 12:51:47

标签: python regex string python-3.x char

例如我有一个字符串:

mvn clean install

我想做什么 - 删除特定单词的所有重复项(仅当它们连续出现时)。结果:

my_str = 'my example example string contains example some text'

我尝试了下一个代码:

my example string contains example some text

import re
my_str = re.sub(' example +', ' example ', my_str)

但它不起作用。 我知道有很多关于my_str = re.sub('\[ example ]+', ' example ', my_str) 的问题,但我仍然无法正确地实现它。

4 个答案:

答案 0 :(得分:3)

您需要创建一个组并量化它:

import re
my_str = 'my example example string contains example some text'
my_str = re.sub(r'\b(example)(?:\s+\1)+\b', r'\1', my_str)
print(my_str) # => my example string contains example some text

# To build the pattern dynamically, if your word is not static
word = "example"
my_str = re.sub(r'(?<!\w)({})(?:\s+\1)+(?!\w)'.format(re.escape(word)), r'\1', my_str)

请参阅Python demo

我添加了单词边界 - 通过原始代码中的空格来判断 - 预期整个单词匹配。

请参阅regex demo here

  • \b - 字边界(替换为(?<!\w) - 在允许当前位置之前没有字词字符 - 在动态方法中,因为re.escape也可能支持像{{1}这样的“字词”然后.word.可能会阻止正则表达式匹配)
  • \b - 第1组(来自替换模式的(example)): \1
  • example - 一次或多次出现
    • (?:\s+\1)+ - 1+空格
    • \s+ - 对第1组值的反向引用,即\1
  • example - 字边界(替换为\b - 在允许当前位置后没有字词。)

请记住,在Python 2.x中,如果需要使(?!\w)字边界支持Unicode,则需要使用re.U

答案 1 :(得分:2)

正则表达式\b(\w+)(?:\s+\1)+\b\b(example)(?:\s+\1)+\b替换:\1

详细说明:

  • \b在字边界处断言位置
  • \w匹配任何单词字符(等于[a-zA-Z0-9_]
  • \s匹配任何空格字符
  • +匹配一次且无限次
  • \1第1组。

Python代码

text = 'my example example string contains example some text'

text = re.sub(r'\b(\w+)(?:\s+\1)+\b', r'\1', text)

输出:

my example string contains example some text

Code demo

答案 2 :(得分:1)

您也可以在纯Python(没有regex)中执行此操作,方法是创建单词列表,然后生成新的string - 应用您的规则。

>>> words = my_str.split()
>>> ' '.join(w for i, w in enumerate(words) if w != words[i-1] or i == 0)
'my example string contains example some text'

答案 3 :(得分:-1)

为什么不使用.replace函数:

my_str = 'my example example string contains example some text'
print my_str.replace("example example", "example")