正则表达式 - 合并重复的连续单词,保留最后一个空格

时间:2016-09-23 04:04:18

标签: python regex

我有一个像这样的字符串

{{TAG}} {{TAG}}{{TAG}} {{TAG}} some other text. {{TAG}} {{TAG}}

我试图将多个连续出现的{{TAG}}合并为一个。所以我有这个正则表达式re.sub(r'(({{TAG}})\s*)+', "{{TAG}}", text)可以正常删除多次出现并给我这个

{{TAG}}some other text. {{TAG}}

但它在最后占用了一个额外的空间,我试图避免。所以我得到

{{TAG}} some other text. {{TAG}}

发现了一个类似的问题here,但这并没有解决我的问题。有任何建议可以改进我的正则表达式或python中的任何其他替代方法吗?

2 个答案:

答案 0 :(得分:3)

一种简单的方法是,您可以将正则表达式分为两个

,而不是+
>>> re.sub(r'(?:{{TAG}}\s*)*{{TAG}}', r'{{TAG}}', string)
'{{TAG}} some other text. {{TAG}}'
  • (?:{{TAG}}\s*)*最后匹配零个或多个{{TAG}}空格。

  • {{TAG}}匹配最后{{TAG}},没有任何空格。

你也可以使用积极的前瞻来解决这个问题

>>> re.sub(r'{{TAG}}\s*(?={{TAG}})', r'', string)
'{{TAG}} some other text. {{TAG}}'
  • {{TAG}}\s*匹配一个{{TAG}},后跟空格。

  • (?={{TAG}}积极向前看。检查上述点中匹配的{{TAG}}是否后跟另一个{{TAG}}

答案 1 :(得分:1)

您与{{TAG}}\s*匹配一次或多次,但您希望匹配{{TAG}}一次,然后匹配零个或多个\s*{{TAG}}个实例。

re.sub('({{TAG}}(?:\s*{{TAG}})*)', '{{TAG}}', text)