我有一个字典,其中的键看起来像这样:
['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
有关更好地解决此问题的任何想法吗?
答案 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