0

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

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

现在,我知道这是完全不正确的(考虑到未评估字符串,甚至未完成)尝试生成新分数,但没有任何关于做什么的指导。希望这对于我如何让它工作的糟糕代码有点不言自明。

编辑:如果匹配为真,记分表应该保存匹配和结果。因此,在这种情况下,如果在字符串中(好吧,应该是)找到单词 foo,则 score 将 +10。

4

2 回答 2

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
于 2012-11-25T11:30:09.367 回答
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.

如果patternis not 不是字符串,则将其视为正则表达式并针对mystring. 如果匹配,则score增加pscore.

只需少量的前期工作,就可以使系统在未来易于扩展。

于 2012-11-25T06:49:44.737 回答