2016-07-28 54 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