Pythonre.sub公司()没有替换所有匹配项

2024-09-30 18:19:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3,我有两个字符串:abbcabb和{}。我想删除一个单个字符的每一次重复出现。例如:

abbcabb应给出c,而{}应给出{}。在

我尝试了以下regex(here):

(.)(.*?)\1

但是,它为第一个字符串提供了错误的输出。另外,当我尝试另一个(here)时:

^{pr2}$

但是,这一次又给出了错误的输出。这里怎么了?在


python代码是一个print语句:

print(re.sub(r'(.)(.*?)\1', '\g<2>', s)) # s is the string

Tags: the字符串代码restringhereis错误
3条回答

re.sub()不执行重叠替换。在它替换第一个匹配项之后,它开始查找匹配项的结束。所以当你在

^{1}$

它首先将abbca替换为bbc。然后它将bb替换为一个空字符串。它不会返回并在bbc中查找另一个匹配项。在

如果你想要,你需要写你自己的循环。在

^{pr2}$

DEMO

网站解释得很好,悬停并使用解释部分。在

(.)(.*?)\1不删除或匹配每个重复出现的情况。它匹配1个字符,然后是中间的任何字符,直到再次遇到同一个字符为止。在

因此,对于abbcabb,“三明治”部分应该是两个a之间的bbc

编辑: 您可以在不使用正则表达式的情况下尝试类似这样的方法:

^{1}$

请注意,这会产生字符串的“最后一次”奇数出现,而不是第一次。在

对于已知的“第一次”事件,您应该使用此answer中建议的计数器。只需改变条件来检查奇数。pseudo code(count[letter] %2 == 1)

不需要正则表达式就可以解决它,如下所示

^{1}$

相关问题 更多 >