'您好,SO社区。 p>
问题:我有很多regEx模式,例如
r'to.*school', r'built.*in'
等等。在每种情况下,我都应该执行一个因情况而异的代码。
示例:如果模式是。* school',我想在'之前找到动词。这就是为什么我写这样的东西:
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 :(得分: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,offset)。从您的帖子判断,也可能有一个正常的表达式,以字符串形式从数据库中检索,并process
扩展为包括一个按需编译的正则表达式字符串。
稍后进行优化:在dict中保留已编译的正则表达式的本地缓存,或者对它们进行pickle,因为重复编译同一个可能是一个非常浪费的CPU。
希望这有帮助。