从配置文件读取到正则表达式,但是读取之后的类型是字符串,也就不具有正则查找的效果了...
例如配置文件的内容是这样的:
pattern_dict = ['re.compile(.*?日历\(.*?\))',
're.compile(pattern[, flags]']
然后读出来是're.compile(.*?期货交易所交易日历\(.*?\))'
,类型是str...
原始需求:
从网上抓很多文章,但是包含特定字符的数据就不要了(例如标题包含“日历”),想到的方案是一个配置文件专门放正则表达式(正则表达式就类似“re.compile(.?日历(.?))”),然后每采集一篇文章,就读取一次配置文件,把里面的过滤条件都过一遍...
cc = importlib.import_module('robot.clear_data').pattern_dict
for cs in cc:
print('正则表达式=============' + str(cs))
if cs.search(item['title']) not in item['title']: #这里就使用正则表达式的Search,如果title能和正则匹配上,就判断一下
return item
配置里肯定只能存字符串,就算可以,你也别存代码;正则匹配的类型就那么多,你取出来之后,最多是穷举出来,一个个组合然后再去匹配。
哦,意思就是,我在配置文件只写表达式,不写用哪种匹配类型,然后匹配类型放到外面写死?
@会发光: 对,放到外面
@三人乐乐:
配置文件只写表达式: pattern_dict = ['.*?期货交易所交易日历\(.*?\)', ] 程序处理: cc = importlib.import_module('robot.clear_data').pattern_dict#获取配置文件里的表达式 for cs in cc: pattern = re.compile(cs) #把表达式放到匹配方法里 if pattern.search(str(item['title'])) not in item['title']: return item
然后报错了...`TypeError: 'in <string>' requires string as left operand, not NoneType`
@会发光: 这个错误,是说int类型不能在string类型里循环,你找下哪里定义错了
你的配置里定义的时候是按字符串定义的, 修改一下就好了.
pattern_dict = ['re.compile(.*?日历\(.*?\))',
're.compile(pattern[, flags]']
改成
pattern_dict = [re.compile(.*?日历\(.*?\)),
re.compile(pattern[, flags]]
另外如果配置里正则表达式很多时, 考虑放在模块级别, 在程序启动导入时提前编译完成. 执行时省去现场编译正则这一步.
放在模块级别啥意思...类么
@会发光: 让它在导入时执行就可以了.
@ABeen: /捂脸,不太懂...导入时执行是啥概念....