首页 > 解决方案 > 使用 re.sub 替换字符串中的子字符串?

问题描述

我需要一些建议才能让我的正则表达式按预期工作。这是对这个问题的扩展问题。

我想用“xxxx”和“zzzz”替换所有密码和密钥。

import re
d = {"password": "xxxx", "secret-key": "zzzz"}

def replace(x):
  key = x.group(1)
  val = d.get(key, x.group(2))
  return f"{key}={val}"

message = "test&password=secure password=secure and my secret-key=securekey should not be logged."
re.sub(r"(?<=???)(\S+)=(\S+)", replace, message)

键前面可以放置任意数量的字符和特殊字符。在上面的示例中,“test&”位于我要查找的关键“密码”前面。但也有可能您要查找的密钥在空格之后开始(例如密码=安全)。

最后,这应该来自上面的示例。

message = test&password=xxxx password=xxxx and my secret-key=zzzz should not be logged.

标签: python-3.xre

解决方案


如果“可以在键前面放置任意数量的字符和特殊字符”,那么我认为您最好明确匹配您的键。例如:

import re
d = {"password": "xxxx", "secret-key": "zzzz"}

message = "test&password=secure password=secure and my secret-key=securekey should not be logged."

for k, mask in d.items():
    message = re.sub(f'(?<={k}=)(\\S+)', mask, message)

print(message)

这将输出:

test&password=xxxx password=xxxx and my secret-key=zzzz should not be logged.

推荐阅读