2016-07-28 93 views
0

我有一個json文件,其中包含用於檢查褻瀆過濾器的術語。解析Python/json褻瀆過濾器中的整個術語

["bad", "word", "plug"] 

,我使用這個(從另一篇文章中找到)解析JSON和搜查任何數據對象集的話。

def word_filter(self, *field_names): 

    import json 
    from pprint import pprint 

    with open('/var/www/groupclique/website/swearWords.json') as data_file:  
     data = json.load(data_file) 

    for field_name in field_names: 
     for term in data: 
      if term in field_name: 
       self.add_validation_error(
        field_name, 
        "%s has profanity" % field_name) 


class JobListing(BaseProtectedModel): 
    id = db.Column(db.Integer, primary_key=True) 
    category = db.Column(db.String(255)) 
    job_title = db.Column(db.String(255)) 

    @before_flush 
    def clean(self): 
     self.word_filter('job_title') 

問題是如果我使用字符串「管道工」,由於json文件中的「插件」一詞,檢查失敗。因爲「plu」是兩個詞。有什麼辦法強制使用json文件中的整個單詞而不是部分?輸出一次運行沒有錯誤:

({ "validation_errors": { "job_title": " job_title has profanity" } }) 

HTTP PAYLOAD: 
{ 
    "job_title":"plumber",  
} 
+0

您可以將'field_names'定義添加到您的代碼段(或者它的一個子集,如果它非常大的話)。當你運行代碼 –

+0

時,你的輸出也是我相信我添加了你所要求的。 – draxous

+0

我認爲你傳遞的數據可能不是你認爲的那種類型。如果你在'word_filter'方法內調用'word_filter('job_title')','field_names'內容爲'('job_title',)',即一個元組中包含一個字符串的元組。您的'field_name'測試中的if項相當於'test_title'中的'plug',這基本上意味着「Does'plug'作爲字符串'test_title'中的子字符串存在嗎?」。我不認爲這就是你想要做的......或者我錯了嗎? –

回答

0

您可以使用string.split()作爲隔離field_name的整個單詞的方法。分割時,它會返回由指定的分隔符分割的字符串的每個部分的列表。利用這一點,您可以檢查是否褻瀆項是分裂列表:

import json 

with open('terms.json') as data_file:  
    data = json.load(data_file) 

for field_name in field_names: 
    for term in data: 
     if term in field_name.split(" "): 
      self.add_validation_error(
       field_name, 
       "%s has profanity" % field_name) 

如果這得到冒險的是,如果有標點符號或類似的東西。例如,這句話:「太陽來了。」不符合「太陽」這個壞詞,也不符合「這裏」。爲了解決資金問題,你要在整個輸入改爲小寫:

if term in field_name.lower().split(" "): 

刪除標點是更復雜一點,但this應該可以幫助您實現。

您可能需要考慮更多的邊緣情況,所以只需要找出兩個我想到的快速案例。

+0

當我使用這個建議時,如果我使用單詞'plumber',所以它不再檢查'plu',但是如果我使用直接單詞(如'bad'或'word'),它會通過驗證而沒有錯誤應該有一個。 PS。這可以是任何類型的文本字段varchar,longtext等。因此可能有段文字需要檢查。我只想讓過濾器檢查過濾器文件中任何類型的直接單詞的使用情況。不是局部的。 – draxous