2012-11-25 93 views
0

我正嘗試使用正則表達式和字符串創建某種類型的評分系統。如果我有一個scoringlist:根據字符串分配點數

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

現在,我知道這是不正確完全(甚至未完成考慮串沒有評估)的努力產生了新的成績,但沒有什麼做任何指導。希望這對於我如何才能使這個工作起作用有一點不言自明。

編輯:如果匹配是真的,那麼得分列表應該保存比賽和結果。因此,在這種情況下,如果在字符串中找到單詞foo(好,應該是),則分數將爲+10。

+1

你的代碼是不言自明的。請描述您要實施的規則,並舉例說明如何對字符串進行評分。 – octern

+0

如果你知道的唯一工具是錘子,每個問題看起來像一個釘子 - 正則表達式是一個強大的錘子,但不是這個工作的正確工具。你的問題領域是NLP,它是CS中最複雜的主題之一,你最好花上幾個小時,而不是試圖重新發明輪子(尋找分類器)。 –

回答

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 

所以對於每個scorelist元組(pattern, pscore),如果模式是一個字符串,尋找在mystring該字符串。如果它在那裏,則通過pscore增加score

如果pattern不是字符串,則將其視爲正則表達式,並根據mystring對其進行評估。如果匹配,則通過pscore增加score

這是一小步前期工作,使得系統在未來很容易擴展。

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