我有一个像这样的字符串
{{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中的任何其他替代方法吗?
答案 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)