用字典中的相应值替换字符串中的键

时间:2018-03-28 17:46:54

标签: python python-3.x

我有一个字典,其中的键看起来像这样:

['NAME', 'ID', 'COURSE', 'DUE', 'SUBMITTED', 'MINUTESLATE', 'LATEDEDUCTION', 'P1', 'P1COMMENTS', 'P2', 'P2COMMENTS', 'SUBTOTAL', 'TOTAL']

我的目标是浏览一个文件,并用我从另一个文件读入的值替换这些键的出现次数。例如:

Problem 1: <<P1>>/35 <<P1COMMENTS>>

将替换为:

Problem 1: 30/35 comment

但是,我在执行此操作时遇到问题,因为密钥可能会重叠。我使用一些我之前查找的代码编写了这个方法,用于另一个任务:

def replace_all(text, dic):
    for i, j in dic.items():
        text = text.replace(i, j)
    return text

然而,这是我第一次在字典中使用重叠键,因此我很难调整此方法以正常工作。目前,这是我的输出:

Problem 1: 30/35 30COMMENTS

有关更好地解决此问题的任何想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用re.sub()查找每个<< key >>,然后将其替换为字典中的相应值。

import re

dct = {
  'P1': 30,
  'P1COMMENTS': 'comment'
}

print(dct)

s = 'Problem 1: <<P1>>/35 <<P1COMMENTS>>'
s = re.sub(r'<<(.*?)>>', lambda x: str(dct[x.group(1)]), s)
print(s)

输出:

Problem 1: 30/35 comment

说明:

<<(.*?)>>

<<                // matches <<
  (               // start of group 1
    .*?           // matches any number (0 or more) of characters (lazy)
  )               // end of group 1
>>                // matches >>

re.sub()将采用模式,替换值和字符串,并将使用替换值替换字符串中的任何模式匹配。功能:

lambda x: str(dct[x.group(1)])

将在字典中查找匹配项,并返回密钥的值。

答案 1 :(得分:0)

您需要的是可自定义的https://stackoverflow.com/a/34983109/801448。幸运的是,Python附带template engine

import re
import string

class CustomTemplate(string.Template):
    pattern = r'<<(?P<named>[^>]+)>>'

template = '<<FOO>> 123456 <<FOOBAR>>tail'
print(CustomTemplate(template).substitute(
    FOO='foo_content',
    FOOBAR='foobar_stuff',
    ))

输出:foo_content 123456 foobar_stufftail