2016-07-28 147 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

这实际上对我有效,谢谢。 –