使用re.sub?

时间:2015-11-20 02:35:30

标签: python regex python-3.x

例如,我有以下字符串:

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>'
>>> 

3 个答案:

答案 0 :(得分:3)

Python提供了string.Template class(另请参阅PEP 292),它可以格式化与您正在使用的类型非常相似的字符串。默认情况下,string.Template类会将$识别为占位符。如果您将其更改为@(通过继承string.Template),则可以通过调用substitutesafe_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'