代码之家  ›  专栏  ›  技术社区  ›  Joezi

在键值列表正则表达式中屏蔽密码

  •  1
  • Joezi  · 技术社区  · 7 年前

    我有一个键值对列表:

    gkketl1Pwd=SDFDSFSFD_213213#asdsad,tech1User=WQEWQQW,techPwd=sdfdsfdM9S,gkkhistPwd=FDSFDDF_WISD01#sad,render1Pwd="SADcyx12321321,213213,recoveryPwd=asdsaSA"ycNJ,9CB9PAJ2w4AbqBHB!,trustStorePwd=test,
    

    我正在使用Python,目前使用以下表达式来屏蔽密码:

    maskedValue=re.sub("([\\w]*Pwd=)(.[^,]*)", lambda m: "%s*****" % m.group(1), args[1])
    

    不幸的是,如果密码包含逗号,则代码无法完全工作。那么,有人知道如何完全屏蔽包含逗号的密码吗。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    您可以扩展模式以匹配任何 , = 或字符串结尾:

    (\w*Pwd=)([^,]*(?:,(?!\w+=|$)[^,]*)*)
                   ^^^^^^^^^^^^^^^^^^^^^
    

    请参阅 regex demo

    • (\w*Pwd=) -第1组:零个或多个文字字符,后跟 Pwd
    • ([^,]*(?:,(?!\w+=)[^,]*)*) -第2组匹配
      • [^,]* -除以下字符外的任何0+字符 , 角色
      • (?:,(?!\w+=|$)[^,]*)* -零或多个后续事件:
        • ,(?!\w+=|$) , 后面不跟1个或多个文字字符,后面跟 符号或字符串结尾
        • -除以下字符外的任何0+字符 ,

    请参阅 Python demo

    import re
    s = 'gkketl1Pwd=SDFDSFSFD_213213#asdsad,tech1User=WQEWQQW,techPwd=sdfdsfdM9S,gkkhistPwd=FDSFDDF_WISD01#sad,render1Pwd="SADcyx12321321,213213,recoveryPwd=asdsaSA"ycNJ,9CB9PAJ2w4AbqBHB!,trustStorePwd=test,'
    maskedValue=re.sub(r"(\w*Pwd=)([^,]*(?:,(?!\w+=|$)[^,]*)*)", lambda m: "{}*****".format(m.group(1)), s)
    print(maskedValue)
    # => gkketl1Pwd=*****,tech1User=WQEWQQW,techPwd=*****,gkkhistPwd=*****,render1Pwd=*****,recoveryPwd=*****,trustStorePwd=*****,