根据字符串分配点数

时间:2012-11-25 06:21:06

标签: python

我正在尝试使用正则表达式和字符串创建某种类型的评分系统。如果我有一个得分表:

string = "foo is my favorite bar ever!"
score = 0
scorelist = {
'\bfoo\b': score += 10,
'hello (foo (bar)?|there)': score -= 15
}

现在,我知道这是完全不正确的(即使未考虑字符串也没有评估)试图产生一个新的分数,但没有任何指导如何做。希望这对我如何使其工作的错误代码有些不言自明。

编辑:如果匹配为真,则得分列表应保留匹配和结果。所以,在这种情况下,如果在字符串中找到foo这个词(好吧,应该是),得分就会+10。

2 个答案:

答案 0 :(得分:0)

我喜欢这种方法:

#!/usr/bin/env python

import re

scorelist = [
    ('\bfoo\b', 10),
    (re.compile('hello (foo (bar)?|there)'), -15),
    ]

score = 0
mystring = "foo is my favorite bar ever!"
for pattern, pscore in scorelist:
    if isinstance(pattern, basestring):
        if pattern in mystring:
            score += pscore
    else:
        if pattern.search(mystring):
            score += pscore

因此对于(pattern, pscore)中的每个scorelist元组,如果模式是字符串,请在mystring中查找该字符串。如果它在那里,请score增加pscore

如果pattern不是字符串,则将其视为正则表达式,并针对mystring对其进行评估。如果匹配,请按score增加pscore

预先做的工作很少,这使得系统在未来很容易扩展。

答案 1 :(得分:0)

装饰师在这里运作良好:

class Matcher(object):
    def __init__(self):
        self.score = 0
        self.patterns = []

    def case(self, pattern):
        def decorator(f):
            self.patterns += [(re.compile(pattern), f)]
            return f
        return decorator

    def match(self, s):
        for pattern, action in self.patterns:
            if pattern.search(s):
                action(self)

m = Matcher()

@m.case(r'\bfoo\b')
def fooMatched(self):
    self.score += 10

@m.case(r'hello (foo (bar)?|there)')
def helloMatched(self):
    self.score -= 15

m.match("foo is my favorite bar ever!")

print m.score