You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式替换第二个冒号与@之间的字符串?

解决方案

问题分析

你的正则表达式失效的原因在于:

  • :*会匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:57:23