Python正则表达式和结尾的贪婪匹配

Python正则表达式和结尾的贪婪匹配,python,regex,Python,Regex,我使用这个简单的正则表达式替换只是为了确保某些URL以斜杠字符结尾: url = re.sub("/*$", "/", "foo/") …但当我运行该代码时,结果意外地是foo/ 在进一步的实验之后,我发现的解释是正则表达式/*$匹配字符串末尾的斜杠,并用另一个斜杠替换它,但在替换的斜杠之后再次匹配空字符串 有什么简单的方法可以解决这个问题吗 更新:看来你可以告诉sub你最多需要更换多少次: url = re.sub(&q

我使用这个简单的正则表达式替换只是为了确保某些URL以斜杠字符结尾:

   url = re.sub("/*$", "/", "foo/")
…但当我运行该代码时,结果意外地是foo/

在进一步的实验之后,我发现的解释是正则表达式/*$匹配字符串末尾的斜杠,并用另一个斜杠替换它,但在替换的斜杠之后再次匹配空字符串

有什么简单的方法可以解决这个问题吗

更新:看来你可以告诉sub你最多需要更换多少次:

   url = re.sub("/*$", "/", "foo/", 1)

为了得到正则表达式的答案:

/*$匹配输入末尾的任意数量的斜杠/,但由于*允许零次重复,因此它还匹配字符串中最后一个字符后的位置,无论是否为斜杠

这允许您首先在末尾附加一个新的斜杠,但也不会阻止在已有斜杠的情况下添加另一个斜杠

关键是:必须检查字符串中的最后一个字符不是斜杠。这可以通过后面的负面观察来实现:

(?<!/)/*$
这将用一个斜杠替换字符串末尾的任意数量的斜杠,但不会产生不必要的重复

…但出于所有实际目的,请使用@James在评论中建议的.rstrip“/”+“/”。

如果您确实希望/需要使用正则表达式,则需要将url结尾与一个或多个非斜杠匹配。然后用斜线和原始结尾替换。因此,还需要一个捕获组来完成该任务:

re.sub[^/]+/*$,r\1/,foo ‘foo/’ re.sub[^/]+/*$,r\1/,foo/ ‘foo/’ re.sub[^/]+/*$,r\1/,foo// ‘foo/’ re.sub[^/]+/*$,r\1/,foo/////////// ‘foo/’ re.sub[^/]+/*$,r\1/,bar/foo// “bar/foo/” 因此,您最好使用更简单的方法:

'foo/'.rstrip'/'+'/'
如果后面有斜杠,则删除斜杠,然后添加斜杠。

为什么要使用re.sub检查条件?如果要匹配不是斜杠的最后一个字符[^/]$,那么为什么要使用regex而不是str.endswith?在这里使用re太过分了。只要使用'foo/'.rstrip'/'+'/'就可以了,正如您自己所说的,在末尾匹配一个空字符串。只需更改为/+$。。。使用*没有意义,因为您想替换现有的斜杠…@Tomerikoo,当输入字符串末尾没有斜杠时,这不起作用