2016-02-28 31 views
2

有谁知道我怎样才能最好地用%s代替文本中的[word]的所有实例,然后构建这些[word]的列表或元组?正则表达式替换多个单词,用它们来构建列表

基本上,我生成PDF文件 - 我在一个数据库中的文本字段存储的PDF文本 - 让我们说,它看起来像:

“你好[患者],你对[最新研究......”

当我动态生成的PDF,我想通过PDF生成器:

"Hello %s, you had a study on %s"%(patient,date) 

我真的不觉得舒服的正则表达式。我正在阅读sub和match - 但我想知道是否有一种方法可以替换[words]并在一行代码中构建元组。

回答

3

你可以做到这一点没有一个正则表达式。试想一下:

>>> tgt="Hello [patient], you had a study on [date]" 
>>> template=tgt.replace('[', '{').replace(']', '}') 
>>> data={'patient':'Bob', 'date':'10/24/2013'} 
>>> template.format(**data) 
'Hello Bob, you had a study on 10/24/2013' 
+0

哇,它很好,它避免了正则表达式,但有没有一种方法来自动建立列表 - 也许我现在可以想到的东西,现在我更清醒 – amchugh89

+0

其实,我可以在我的硬编码字典django视图 - 所有30个或更多可能的[单词]可选 - 像{'patient':pat.name,'date',exam.date,'ssn':pat.ssn ...} pat和ex是django模型实例 - 你的代码可能会诀窍 – amchugh89

1

请尝试以下模式:

>>> import re 
>>> input = "Hello [patient], you had a study on [date 10-10-16]." 
>>> re.sub('\[[^\]]+]', '%s', input) 
'Hello %s, you had a study on %s.' 
0
使用 re.sub,但不同的模式

相同的解决方案:

>>> inp = "Hello [patient], you had a study on [date]." 
>>> 
>>> re.sub(r'\[.*?\]', '%s', inp) 
'Hello %s, you had a study on %s.' 

如果你愿意从一个数据对象与价值观,以取代那些PARAMS像字典,例如:

>>> data 
{'date': '10/24/2013', 'patient': 'Bob'} 

然后我会这样做:

>>> inp = "Hello [patient], you had a study on [date]." 
>>> data 
{'date': '10/24/2013', 'patient': 'Bob'} 
>>> 
>>> pat = re.compile(r'\[(?P<param>.*?)\]') 
>>> pat.sub(lambda m: data[m.group('param')], inp) 
'Hello Bob, you had a study on 10/24/2013.' 
+0

'\ [[^]] * \]'是整洁的.. – heemayl