2016-02-28 72 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