例如,我有以下字符串:
s = 'Name: @name, ID: @id'
现在我想使用re.sub()
来替换@name
和@id
。我知道我可以使用group来捕获一些字符串,然后使用'\g<index>'
或r'\index'
来使用它。
但现在我需要将它用作dict键,我有这个词:
d = {'id': '20', 'name': 'Jon'}
我希望我能得到这个:
s = 'Name: Jon, ID: 20'
我也试过了:
>>> re.sub('@(\w+)', d[r'\1'], s)
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: '\\1'
>>> re.sub('@(\w+)', d['\g<1>'], s)
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: '\\g<1>'
>>>
答案 0 :(得分:3)
Python提供了string.Template
class(另请参阅PEP 292),它可以格式化与您正在使用的类型非常相似的字符串。默认情况下,string.Template
类会将$
识别为占位符。如果您将其更改为@
(通过继承string.Template
),则可以通过调用substitute
或safe_substitute
方法执行替换:
import string
class MyTemplate(string.Template):
delimiter = '@'
content = 'Name: @name, ID: @id'
d = {'id': '20', 'name': 'Jon'}
template = MyTemplate(content)
result = template.safe_substitute(**d)
print(result)
打印
Name: Jon, ID: 20
答案 1 :(得分:1)
在这种情况下,您需要使用re.sub
的函数表单。对于您的基本用例,它可以是一个简单的:
re.sub(r'@(\w+)', lambda m: d[m.group(1)], s)
如果逻辑更复杂,那么顶级def
就是最佳选择。基本上,您根据re.sub
docs传递callable
而不是str
:
如果repl是一个函数,则会针对每个非重叠的模式调用它。该函数接受一个匹配对象参数,并返回替换字符串。
答案 2 :(得分:0)
如果以不同方式格式化字符串是一个选项,您可以这样做:
>>> d = {'id': '20', 'name': 'Jon'}
>>> 'Name: {name}, ID: {id}'.format(**d)
'Name: Jon, ID: 20'