【问题标题】:String substitution using dictionary使用字典替换字符串
【发布时间】:2023-11-18 03:28:02
【问题描述】:

我正在学习 python 并处理字符串以找到使用字典进行字符串替换的更好方法

我有一个字符串,其中包含我的自定义占位符,如下所示:

placeholder_prefix = '$['
placeholder_suffix = ']'

dict={'key1':'string','key2':placeholders}
msg='This $[key1] contains custom $[key2]'

我希望占位符('prefix-suffix' 和 'keys')应替换为字典中的 'value',如下所示:

'此字符串包含自定义占位符'

我可以通过编写函数获取消息:“此 [字符串] 包含自定义 [占位符]”:

def replace_all(text):
    for key, value in brand_dictionary.iteritems():
        text = text.replace(key, value).replace('$[', '[')        
    return text

我可以尝试不同的替换来删除 '$[' 和 ']' 但这可以替换作为消息本身的一部分包含的任何字符(如 '$'、'['、']')(而不是作为占位符)。所以我想避免这种情况,只替换自定义占位符。

我可以想到正则表达式(用于占位符),但由于我的消息包含多个键,所以它似乎没有用?

在python中有没有更好的方法?

【问题讨论】:

  • 这是您必须以这种方式解决的某种任务吗?或者你不能只使用“格式”吗? (docs.python.org/2/library/string.html#format-string-syntax)
  • 'This {key1} contains custom {key2}'.format(**dict)
  • dict 隐藏了内置的 dict 类型。
  • 我需要自定义占位符(用于自定义消息中的某些部分,用于品牌推广)。格式确实适用于 %s,我知道它可以很好地与字典一起使用

标签: python string replace string-formatting


【解决方案1】:

试试这个:

dict={key1:'string',key2:placeholders}

msg='This {key1} contains custom {key2}'.format(**dict)

我运行的示例:

>>> msg="hello {a} {b}"
>>> t={"a":"aa","b":"bb"}
>>> msg="hello {a} {b}".format(**t)
>>> msg
'hello aa bb'

【讨论】:

  • key1和key2不需要是字符串吗?
  • dict={'key1':'string','key2':placeholders} msg='这个 {key1} 包含自定义 {key2}'.format(**dict)
【解决方案2】:

作为一种更通用的方式,您可以将re.sub 与适当的替换功能一起使用:

>>> d={'key1':'string','key2':'placeholders'}
>>> re.sub(r'\$\[([^\]]*)\]',lambda x:d.get(x.group(1)),msg)
'This string contains custom placeholders'

使用正则表达式的优点是它拒绝匹配字符串中不具有预期格式的占位符!

或者作为一种更简单的方法,您可以使用以下字符串格式:

In [123]: d={'key1':'string','key2':'placeholders'}
     ...: msg='This {key1} contains custom {key2}'
     ...: 
     ...: 

In [124]: msg.format(**d)
Out[124]: 'This string contains custom placeholders'

或者,如果您的变量数量不是那么大,您可以将您的键作为可在当前命名空间中访问的变量,然后使用自 Python-3.6 以来引入的功能 f-strings,而不是使用字典:

In [125]: key1='string'
     ...: key2= 'placeholders'
     ...: msg=f'This {key1} contains custom {key2}'
     ...: 

In [126]: msg
Out[126]: 'This string contains custom placeholders'

【讨论】:

  • 完美!这正是我想要的。谢谢卡斯拉
  • 有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基 ;)
  • 我尝试过使用相同的正则表达式,但不知道“lamda”表达式及其有用性。你可以解决一个问题,但总是有一个最好的解决方案!在这种情况下,它是从 Kasra 得到的 :-)
【解决方案3】:

如果您可以更改占位符,您可以使用 -%(key)s - 和 % 运算符在这些位置自动应用字典。

示例 -

>>> dict={'key1':'string','key2':'placeholders'}
>>> msg='This %(key1)s contains custom %(key2)s'
>>> print(msg%dict)
This string contains custom placeholders

【讨论】:

    【解决方案4】:

    另一个选项包括使用字符串替换进行格式化:

    msg='This %(key1)s contains custom %(key2)s'
    dict={'key1':'string','key2':'placeholders'}
    print(msg%dict)
    
    >> This string contains custom placeholders
    

    【讨论】:

      【解决方案5】:

      考虑使用现有的模板库,例如 Mako (http://www.makotemplates.org/),而不是自己滚动。

      他们已经做了你想做的一切,还有很多你还没想过的事情。

      (是的,它们也适用于生成非 HTML 文本)

      【讨论】:

        最近更新 更多