2016-07-28 105 views
0

'你好,SO社區。避免複製粘貼和硬編碼的最佳方法

問題:我有很多正則表達式模式,如

r'to.*school', r'built.*in' 

等。在任何情況下,我應該執行的代碼,從形勢變化到的情況。

例子:如果模式是「爲*上學。」,我想找到之前「到」動詞,這就是爲什麼我寫的是這樣的:。

for num, part in enumerate(sentence): 
    if part == 'to': 
     result = sentence[num-1] 

如果模式的內置*在,我想找到的時候,這就是爲什麼我寫的東西,如:

for num, part in enumerate(sentence): 
    if part == 'in': 
     result = sentence[num+1] 

所以有這個問題 - 如何避免複製粘貼代碼,如果有超過500種模式和每個模式都有它自己的方式獲得結果?

我的想法:我知道它應該是某種數據庫,它存儲模式和解決方案,但是如果它是字符串,我該如何執行解決方案?我完全迷失了。

+0

你能舉一個'sentence'和你想要的輸出的例子嗎? –

+0

我會介紹一個表,其中包含在第一列中的模式,並在第二個表中引用一個適當的方法。 – Humbalan

+0

@Chris_Rands當然。 'origSentence ='我去上學';模式= r'to。* school'; partSentence = ['I','go','to','school'];結果='去';' –

回答

1

如果在代碼中有足夠的規律性,您需要編寫一個函數來接受句子以及決定如何處理它的其他內容。這有時稱爲參數化。例如與上面,想必簡單的例子,你必須

def process(sentence, parttest, offset): 
    for num, part in enumerate(sentence): 
     if part == parttest: 
      return sentence[num+offset] 

,並要求第一和第二分別例子

result = process(sentence, 'to', -1) 
result2 = process(sentence, 'in', +1) 

現在你可以得到的參數(parttest,偏移量)從數據庫。從你的帖子來看,可能還會有一個字符串形式的正則表達式從數據庫中檢索,並且process被擴展爲包含一個按需編譯的正則表達式字符串。

稍後優化:將已編譯的正則表達式的本地緩存保存在一個字典中,或者醃製它們,因爲反覆編譯同一個可能會導致CPU的浪費。

希望這會有所幫助。

+0

這實際上對我有效,謝謝。 –