我正在尝试使用正则表达式和字符串创建某种类型的评分系统。如果我有一个得分表:
string = "foo is my favorite bar ever!"
score = 0
scorelist = {
'\bfoo\b': score += 10,
'hello (foo (bar)?|there)': score -= 15
}
现在,我知道这是完全不正确的(即使未考虑字符串也没有评估)试图产生一个新的分数,但没有任何指导如何做。希望这对我如何使其工作的错误代码有些不言自明。
编辑:如果匹配为真,则得分列表应保留匹配和结果。所以,在这种情况下,如果在字符串中找到foo这个词(好吧,应该是),得分就会+10。
答案 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