Python regex-合并重复的连续字,保留最后一个空格

Python regex-合并重复的连续字,保留最后一个空格,python,regex,Python,Regex,我有一根这样的绳子 {{TAG}}{{TAG}}{{{TAG}}}{{TAG}}一些其他文本。{{TAG}}{{TAG}} 我正在尝试将多个连续出现的{{TAG}合并为一个。因此,我有一个正则表达式re.sub(r'({{TAG}})\s*)+,“{{TAG}}”,text),它可以很好地删除多个匹配项,并给出了这个结果 {{TAG}}一些其他文本。{{TAG}} re.sub('({{TAG}}(?:\s*{{TAG}})*)', '{{TAG}}', text) 但它在最后占用了一个额外的

我有一根这样的绳子

{{TAG}}{{TAG}}{{{TAG}}}{{TAG}}一些其他文本。{{TAG}}{{TAG}}

我正在尝试将多个连续出现的
{{TAG}
合并为一个。因此,我有一个正则表达式
re.sub(r'({{TAG}})\s*)+,“{{TAG}}”,text)
,它可以很好地删除多个匹配项,并给出了这个结果

{{TAG}}一些其他文本。{{TAG}}

re.sub('({{TAG}}(?:\s*{{TAG}})*)', '{{TAG}}', text)
但它在最后占用了一个额外的空间,我正试图避免。这样我就可以

{{TAG}}一些其他文本。{{TAG}}


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

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

>>> 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}


一种简单的方法是,您可以将正则表达式拆分为两部分,而不是
+

>>> 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}


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

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

您正在一次或多次匹配
{{{TAG}}\s*
,但您希望匹配
{{TAG}}
一次,然后是
\s*{{TAG}}
的零个或多个实例

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