0

正規表現と文字列を使用して、ある種のスコアリング システムを作成しようとしています。スコアリストがある場合:

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

今、私はこれが新しいスコアを生成しようとするのは完全に間違っていることを知っています (そして、文字列が評価されていないことを考えると未完成ですらあります) が、何をすべきかについてのガイダンスはありません. うまくいけば、これを機能させる方法に関する悪いコードで、これはある程度自明です。

編集:スコアリストは、一致が真の場合、一致と結果を保持することになっています。したがって、この場合、文字列に foo という単語が (あるはずですが) 見つかった場合、スコアは +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

I like this approach:

#!/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

So for each (pattern, pscore) tuple in scorelist, if the pattern is a string, look for that string in mystring. If it's there, increment score by pscore.

If pattern isn't not a string, then treat it as a regular expression and evaluate it against mystring. If it matches, increment score by pscore.

It's a tiny amount of work up front that makes the system easy to extend in the future.

于 2012-11-25T06:49:44.737 に答える