首页 > Python > 使用python做简单规则的文本过滤

使用python做简单规则的文本过滤

当报文内容很多时为了方便用户选择查看有意义的报文, 可以对报文进行过滤. 支持用户输入需要过滤的字符的关键字. 比如输入要过滤的关键字为”nMcuAdrs=0×10301″. 那么对于nMcuAdrs=0×10301的报文则不显示, 仅显示满足关键字过滤规则的报文. 当需要有多个要过滤的关键字时, 需要支持一下的规则:

  1. 与 key1 and key2, 表示既要满足关键字key1也要满足关键字key2.
  2. 或 key1 or key2, 表示只要满足key1或者kye2任一即可.
  3. 支持与和或的组合, 与的优先级高于或. 比如 key1 and key2 or key3, 表示只要满足key1、key2, 或者key3即可
  4. 括号的优先级高于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)

  1. text是过滤规则表达式, message是需要过滤的文本(eg. text=”\”hello\” and \”world\”", message=” icesorrow, hello!”)

  2. 先从text中提取被双引号引用的keyword, 然后用keyword去message中匹配, 返回一个布尔值的字符串

  3. 通过这个函数处理之后会得到 “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"

分类: Python 标签:, ,
  1. 还没有评论。
  1. No trackbacks yet.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Connecting to %s

加关注

Get every new post delivered to your Inbox.