如何用正则表达式替换第二个冒号与@之间的字符串?
解决方案
问题分析
你的正则表达式失效的原因在于:
:*会匹配0个或多个冒号,无法精准定位到第二个冒号的位置.+是贪婪匹配模式,会从字符串开头一直匹配到@api.example.com前的最后一个字符,导致整个前缀(包括https://john:)都被替换掉,最终输出不符合预期。
正确实现方案
这里提供两种可靠的正则替换方案:
方案1:使用正向断言精准匹配目标区间
利用正则的正向断言,只定位第二个冒号到第一个@之间的内容,不捕获前后无关部分:
import re s = 'https://john:ABCDE@api.example.com' s_out = re.sub(r'(?<=:)[^:@]+(?=@api.example.com)', 'REPLACED', s) print(s_out) # 输出: https://john:REPLACED@api.example.com
正则解释:
(?<=:):正向后行断言,确保匹配内容的前一个字符是冒号(对应用户名后的第二个冒号)[^:@]+:匹配除冒号、@之外的任意字符,刚好覆盖需要替换的密码部分(?=@api.example.com):正向前行断言,确保匹配内容的后一段是@api.example.com,精准锁定目标位置
方案2:使用捕获组保留前后内容
通过捕获组保留需要保留的前缀和后缀,只替换中间的目标内容:
import re s = 'https://john:ABCDE@api.example.com' s_out = re.sub(r'(.+:)([^:@]+)(@api.example.com)', r'\1REPLACED\3', s) print(s_out)
正则解释:
(.+:):捕获组1,匹配到第二个冒号为止的所有内容(如https://john:)([^:@]+):捕获组2,匹配需要替换的密码部分(ABCDE)(@api.example.com):捕获组3,匹配后缀固定部分- 替换时用
\1和\3调用捕获的前后内容,中间替换为REPLACED
内容的提问来源于stack exchange,提问作者John Tan
相关产品推荐
相关产品推荐

