用字典键/值替换占位符

2024-10-04 03:25:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有带占位符的文本,如:

sometext $plc_hldr1 some more text $plc_hldr2 some more more text $1234date_placeholder some text $5678date_placeholder

然后我有字典,其中键表示占位符,值是占位符应替换为的值:

placeholders = {'$plc_hldr1': '1111',
                '$plc_hldr2': 'abcd'}

我找到并调整了处理更换的功能:

def multiple_replace(adict, text):
   # Create a regular expression from all of the dictionary keys
    regex = re.compile("|".join(map(re.escape, adict.keys(  ))))

   # For each match, look up the corresponding value in the dictionary
   return regex.sub(lambda match: adict[match.group(0)], text)

函数正在为$plc_hldr1$plc_hldr2执行它的工作

但是有$1234date_placeholder$5678date_placeholder两个值都应该用一个预定义值替换。在这种情况下date_placeholder保持不变,但数字部分总是不同的

我想到的是:

def multiple_replace(adict, text):
   # Create a regular expression from all of the dictionary keys
    regex = re.compile("|".join(map(re.escape, adict.keys(  ))))
    regex = re.sub("\$\d*date_placeholder", "20200101", txt)
   # For each match, look up the corresponding value in the dictionary
   return regex.sub(lambda match: adict[match.group(0)], text)

但是有没有更优雅的方式呢?如果我有更多带有可变数字部分的占位符,这些占位符应替换为相同的值(例如$1234dname\U占位符,$1234age\U占位符)


Tags: thetextredictionarydefmorematchsome
1条回答
网友
1楼 · 发布于 2024-10-04 03:25:16

如果不需要转义其余占位符,可以将\$\d*date_placeholder与其余占位符组合。然后,创建第二个没有任何特殊正则表达式字符的字典,用于查找要替换正则表达式匹配项的内容

map(re.escape, adict.keys())在上面的代码中是必需的,因为占位符名称中有特殊的正则字符$。我建议您自己添加特殊字符转义,并将\$\d*date_placeholder查找添加为placeholders中的键/值对。这样就不需要在键上映射re.escape,也不需要在multiple_replace函数中使用第二个替换

就像这样

import re

placeholders = {r'\$plc_hldr1': '1111',
                r'\$plc_hldr2': 'abcd',
                r'\$\d*date_placeholder': '20200101'}

def remove_escape_chars(reggie):
    return re.sub(r'\\\$\\d\*|\$\d*|\\', '', reggie)

def multiple_replace(escape_dict, text):
   # Create a second dictionary to lookup regex match replacement targets
   unescaped_placeholders = { remove_escape_chars(k): placeholders[k] for k in placeholders }

   # Create a regular expression from all of the dictionary keys
   regex = re.compile("|".join(escape_dict.keys()))
   return regex.sub(lambda match: unescaped_placeholders[remove_escape_chars(match.group(0))], text)

text = "sometext $plc_hldr1 some more text $plc_hldr2 some more more text $1234date_placeholder some text $5678date_placeholder"

result = multiple_replace(placeholders, text)
print(result)

这种方法的缺点是,如果在占位符中引入新模式,则必须更新remove_escape_chars(...)函数中的正则表达式。(它将扩展到类似的模式,例如$1234dname_placeholder$1234age_placeholder。)

相关问题 更多 >