使用python做简单规则的文本过滤
当报文内容很多时为了方便用户选择查看有意义的报文, 可以对报文进行过滤. 支持用户输入需要过滤的字符的关键字. 比如输入要过滤的关键字为”nMcuAdrs=0×10301″. 那么对于nMcuAdrs=0×10301的报文则不显示, 仅显示满足关键字过滤规则的报文. 当需要有多个要过滤的关键字时, 需要支持一下的规则:
- 与 key1 and key2, 表示既要满足关键字key1也要满足关键字key2.
- 或 key1 or key2, 表示只要满足key1或者kye2任一即可.
- 支持与和或的组合, 与的优先级高于或. 比如 key1 and key2 or key3, 表示只要满足key1、key2, 或者key3即可
- 括号的优先级高于and. 比如 key1 and (key2 or key3), 表示满足key1并且满足key2、key3中任一即可.
每一个关键字都用双引号括起来, 比如输入过滤的字符为”nMcuAdrs=0×10301″ and “CmdCode = 0x11ab”, 表示既要满足nMcuAdrs=0×10301也要满足CmdCode = 0x11ab.
上述规定的and、or、()语法和python的算术表达式的语法是一样的, 再结合python的eval函数和正则表达式能够很简单的解决上述文本过滤问题.
import re
def multiple_match(text, message):
def match(string):
return str(bool(re.search(string.group(1), message)))
pattern = re.compile("\"([^\"]*)\"")
return pattern.sub(match, text)
-
text是过滤规则表达式, message是需要过滤的文本(eg. text=”\”hello\” and \”world\”", message=” icesorrow, hello!”)
-
先从text中提取被双引号引用的keyword, 然后用keyword去message中匹配, 返回一个布尔值的字符串
- 通过这个函数处理之后会得到 “True and False”(是个字符串), 再使用eval函数就可以得到结果了, 包含括号的语法同样也可以处理
再引入异常处理, 对eval的表达式做语法分析, 以纠正用户输入的文本过滤表达式, 最后的版本如下:
import re
def multiple_match(text, message):
def match(string):
return str(bool(re.search(string.group(1), message)))
pattern = re.compile("\"([^\"]*)\"")
return eval(pattern.sub(match, text))
if __name__=="__main__":
text = "\"hello\" and (\"world\" or \"haolee\")"
message = " haolee, hello!"
try:
print multiple_match(text, message)
except SyntaxError:
print "syntax error: check filter expression"


