Python 正则表达式:如何删除冗余子字符串

Python 正则表达式:如何删除冗余子字符串,python,regex,Python,Regex,我有一根绳子。此字符串末尾有多余的文本。我想删除所有冗余文本(冗余文本的第一个和第二个实例)。如何找到字符串末尾的所有重复文本并将其删除 在我的示例中,我正在处理一个字符串,该字符串也有一个我要删除的前缀。例如,我想:前缀abcde123de123返回abc 重复的子字符串的长度可以不同。所以我想:前缀a b c 123 c 123返回a b 我试着把这个和 import re re.sub( r'prefix ([a-z ]*)\2([a-z ]* \d*)$', r'\1'

我有一根绳子。此字符串末尾有多余的文本。我想删除所有冗余文本(冗余文本的第一个和第二个实例)。如何找到字符串末尾的所有重复文本并将其删除

在我的示例中,我正在处理一个字符串,该字符串也有一个我要删除的前缀。例如,我想:
前缀abcde123de123
返回
abc


重复的子字符串的长度可以不同。所以我想:
前缀a b c 123 c 123
返回
a b

我试着把这个和

import re
re.sub(
    r'prefix ([a-z ]*)\2([a-z ]* \d*)$',
    r'\1',
    'prefix a b c 123 c 123'
)
但这当然会导致转发引用错误,因为我在创建\2之前引用了它的内容


我正在用Python编写这个正则表达式。3.7.

您可以使用此正则表达式进行搜索:

^prefix\s+(.*)(.+?)\2+$
并使用:
r'\1'
进行替换

Python代码:

import re

r = re.sub(
    r'^prefix\s+(.*?)(.+?)\2+$',
    r'\1',
    'prefix a b c 123 c 123'
)
print (r)

正则表达式详细信息:

import re

r = re.sub(
    r'^prefix\s+(.*?)(.+?)\2+$',
    r'\1',
    'prefix a b c 123 c 123'
)
print (r)
  • ^
    :开始
  • prefix\s+
    :匹配文本
    prefix
    ,后跟1+空格
  • (.*)
    :匹配捕获组#1中的0个或多个字符
  • (.+?)
    ;匹配捕获组#2中的一个或多个任意字符
  • \2+
    :匹配第2组的1次或多次重复
  • $
    :结束

在您的模式中,您可以将
\2
放在第二组后面,字符串末尾之前

在更换使用组1中

prefix ([a-z ]*)([a-z ]* \d*)\2$

输出

a b

可能是
re.sub(r'前缀([a-z]*)([a-z]*\d*)\2*$,r'\1',文本)
?看见或者,
prefix([a-z]*)([a-z]*\d*)\2+$
这很有效,谢谢!