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