python轻量规则引擎rule-engine入门与应用实践

news2024/11/17 5:31:42

rule-engine是一种轻量级、可选类型的表达式语言,具有用于匹配任意 Python 对象的自定义语法,使用python语言开发。

规则引擎表达式用自己的语言编写,在 Python 中定义为字符串。其语法与 Python 最相似,但也受到 Ruby 的一些启发。这种语言的一些特性包括:

  • 可选类型提示
  • 用正则表达式匹配字符串
  • 日期时间数据类型
  • 复合数据类型(相当于 Python 字典、列表和集合类型)
  • 数据属性
  • 线程安全

参考文档可在 https://zeroSteiner.github.io/rule-engine/ 获取。

规则语法

创建规则的语法基于计算为 True(匹配)或 False(不匹配)的逻辑表达式。规则支持一小组数据类型,这些数据类型可以定义为文字或使用应用规则的 Python 对象进行解析。有关受支持类型的完整列表,请参阅数据类型表。

并非所有受支持的操作都适用于下表所示的所有数据类型。规则遵循标准的操作顺序。

语法

表达式语法支持多种操作,包括数值数据的基本算术和字符串的正则表达式。操作是类型感知的,并且在使用不兼容的类型时会引发异常。

支持的操作

下表概述了可在规则引擎表达式中使用的所有运算符。

算术运算符

在这里插入图片描述

比较运算符

在这里插入图片描述

算术比较运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

  • 按位运算支持浮点值,但如果该值不是自然数,则会引发EvaluationError。

  • 算术比较运算符支持多种数据类型,但左值的数据类型必须与右值的数据类型相同。例如,一个 STRING 可以与另一个 STRING 进行比较,但不能与 FLOAT 进行比较。该技术与 Python 使用的基于字典顺序的序列比较技术相同。

  • 使用正则表达式操作时,左侧的表达式是要比较的字符串,右侧的表达式是用于匹配或搜索操作的正则表达式。

关于时间 DATETIME 值

DATETIME 文字必须以 ISO-8601 格式指定。底层解析逻辑由 dateutil.parser.isoparse() 提供。未指定时间的 DATETIME 值(例如 d"2019-09-23")将计算为指定日期的午夜整点的 DATETIME。

显示等效文字表达式的示例规则:

d"2019-09-23" == d"2019-09-23 00:00:00" (日期默认为午夜,除非指定时间)

安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple rule-engine

示例代码

示例1,官方示例

import rule_engine
# match a literal first name and applying a regex to the email
rule = rule_engine.Rule(
    'first_name == "Luke" and email =~ ".*@rebels.org$"'
) # => <Rule text='first_name == "Luke" and email =~ ".*@rebels.org$"' >
rule.matches({
    'first_name': 'Luke', 'last_name': 'Skywalker', 'email': 'luke@rebels.org'
}) # => True
rule.matches({
   'first_name': 'Darth', 'last_name': 'Vader', 'email': 'dvader@empire.net'
}) # => False

示例2,自定义

在这里插入图片描述

rule = rule_engine.Rule(
    'num >= 20000 and num<=30000'
)
rule.matches({
   'num': 2500
}) # True

rule = rule_engine.Rule(
    '(num >= 2000 and num<=3000) or type=="cars"'
)
rule.matches({
   'num': 1500,'type':'bus'
})  # False

示例3,过滤

改造此方法,可以实现示例2中,按条件获取得分值。

import datetime

comics = [
  {
    'title': 'Batman',
    'publisher': 'DC',
    'issue': 89,
    'released': datetime.date(2020, 4, 28)
  },
  {
    'title': 'Flash',
    'publisher': 'DC',
    'issue': 753,
    'released': datetime.date(2020, 5, 5)
  },
  {
    'title': 'Captain Marvel',
    'publisher': 'Marvel',
    'issue': 18,
    'released': datetime.date(2020, 5, 6)
  }
]
rule = rule_engine.Rule(
  # match books published by DC
  'publisher == "DC"'
)
for v in rule.filter(comics):
    print(v)
    print(v['title'])
	{'title': 'Batman', 'publisher': 'DC', 'issue': 89, 'released': datetime.date(2020, 4, 28)}
	Batman
	{'title': 'Flash', 'publisher': 'DC', 'issue': 753, 'released': datetime.date(2020, 5, 5)}
	Flash

示例4,另外一种方案

conditon=[['num >= 30000',40],
          ['num >= 20000 and num<30000',30],
          ['num >= 10000 and num<20000',20],
          ['num <10000',10]]
         
num = 13003
for v in conditon:
    rule=rule_engine.Rule(v[0])
    if rule.matches({'num':num}):
        print(v[1])
        break

总结

rule-engine做为一种轻量级规则引擎,在数据分析中做为条件规则使用,基本够用了。

参考:

Considerations for building a rules engine in Python. 2021.09
https://zerosteiner.github.io/rule-engine/index.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos8 降低gcc版本至gcc-7.3

1 首先卸载系统中的gcc sudo yum remove gcc 2 重新安装gcc-7.3 sudo dnf group install “Development Tools” 然后再次卸载gcc sudo yum remove gcc 然后发现centos-release-scl-rh已经安装了 sudo yum install centos-release-scl-rh yum -y install devtoolset-7-gcc dev…

SCAU 编译原理 实验1 词法分析实验

实验内容&#xff1a;参考附录C.1 设计一个简单语言的词法分析程序&#xff0c;要求能够正确处理关键字、运算符&#xff08;单个符号的和复合的运算符如>、>&#xff09;、分界符、标识符、常数等单词&#xff0c;以及不是单词的换行回车、注释。 #include<stdio.h&…

【自然语言处理】理解词向量、CBOW与Skip-Gram模型

文章目录 一、词向量基础知识1.1 One-hot表示1.2 Distributed表示 二、word2vec基础知识2.1 CBOW和Skip-gram 三、基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型3.1 CBOW 模型3.2 Skip-gram 模型 参考资料 由于计算机不能直接对各种字符进行运算&#xff0c;为此需要…

Java8实战-总结44

Java8实战-总结44 CompletableFuture&#xff1a;组合式异步编程Future 接口Future 接口的局限性使用 CompletableFuture 构建异步应用 CompletableFuture&#xff1a;组合式异步编程 最近这些年&#xff0c;两种趋势不断地推动我们反思我们设计软件的方式。第一种趋势和应用运…

让 CHAT 充分发挥优势

今天&#xff0c;小编带大家看下CHAT是如何写作的&#xff1f; 作为家长的你&#xff0c;是不是有为孩子的作业而烦恼&#xff1f;是不是也担心孩子的压力太大&#xff1f;产生逆反心理&#xff0c;今天我们将看下如何利用CHAT来帮助孩子提高学习的质量&#xff0c;帮家长减轻心…

基于hugging face的autogptq量化实践

1.量化并保存到本地的 #导入库&#xff1a; from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig model_id "facebook/opt-125m"quantization_config GPTQConfig(bits4,group_size128,dataset"c4",desc_actFalse, )tokenizer A…

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…

让数据“动”起来:Python动态图表制作详解

在读技术博客的过程中&#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的&#xff1f;难度大吗&#xff1f;这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代&#xff0c;数据科学家、分析师在被要求对数据有…

DAY33 1005. K次取反后最大化的数组和 + 134. 加油站 + 135. 分发糖果

1005. K次取反后最大化的数组和 题目要求&#xff1a;给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; …

风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)

1.前言 1.1.运行效果&#xff1a;风力发电功率预测&#xff08;CEEMDAN-LSTM-CNN-CBAM模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 1.2.环境库&#xff1a; 如果库版本不一样&#xff0c; 一般也可以运行&#xff0c;这里展示我运行时候的库版本&#xff0c;是…

hadoop伪分布式安装部署

首先jdk安装完毕 jdk安装文档参考&#xff1a; Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并配置环境变量_Xi-Yuan的博客-CSDN博客 准备好hadoop的安装包 我的下载地址如下&#xff1a; We Transfer Gratuit. Envoi scuris de gros fichiers. 将hadoop包上传到随…

Leetcode—2678.老人的数目【简单】

2023每日刷题&#xff08;八&#xff09; Leetcode—2678.老人的数目 int countSeniors(char ** details, int detailsSize){ int ans 0; int i; int tens 0; int ones 0; for(i 0; i < detailsSize; i) { tens ((details i) 11) - ‘0’; ones ((details i) 12)…

二十三、设计模式之组合模式![

目录 二十三、设计模式之组合模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…

报错:SSL routines:ssl3_get_record:wrong version number

一、问题描述 前后端联调的时候&#xff0c;连接后端本地服务器&#xff0c;接口一直pending调不通&#xff0c;控制台还报以下错误&#xff1a; 立马随手搜索了一下解决方案&#xff0c;但是emmm&#xff0c;不符合前端的实际情况&#xff1a; 二、解决方法&#xff1a; 实际…

WIN11+OPENCV4.8 编译及下载失败处理方法

1. 基础准备 1. 下载Opencv和Contrib库 Opencv&#xff1a;Releases opencv/opencv GitHub Contrib&#xff1a;Tags opencv/opencv_contrib GitHub 2. 安装Visual Studio 或 MinGW64 MinGW&#xff1a;Tags opencv/opencv_contrib GitHub 这里安装1.12.0 MinGW 。 以…

uniapp 自定义导航栏

自定义导航栏 修改 pages.json 在 pages.json 中将 navigateionStyle 设为 custom 新建 systemInfo.js systemInfo.js 用来获取当前设备的机型系统信息&#xff0c;放在 common 目录下 /*** 此 js 文件管理关于当前设备的机型系统信息*/ const systemInfo function() {/***…

Python深度学习实战-基于Sequential方法搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 第一步&#xff1a;导入模块&#xff1a;import tensorflow as tf 第二步&#xff1a;制定输入网络的训练集和测试集 第三步&#xff1a;搭建网络结构&#xff1a;tf.keras.models.Sequential() 第四步&#xff1a;配置训练方法&#xff1a;model.compile()&#x…

Lec09 Interrupts | 中断

中断与系统调用区别 asynchronous。当硬件生成中断时&#xff0c;Interrupt handler与当前运行的进程在CPU上没有任何关联。但如果是系统调用的话&#xff0c;系统调用发生在运行进程的context下。concurrency。我们这节课会稍微介绍并发&#xff0c;在下一节课&#xff0c;我…

水电站与数据可视化:洞察未来能源趋势的窗口

在信息时代的浪潮中&#xff0c;数据可视化正成为推动能源领域发展的重要工具。今天&#xff0c;我们将带您一起探索水电站与数据可视化的结合&#xff0c;如何成为洞察未来能源趋势的窗口。水电站作为传统能源领域的重要组成部分&#xff0c;它的运行与管理涉及大量的数据。然…

开源Linux社区Armbian开发指南

1. 什么是armbian Armbian是一个基于Debian或Ubuntu的开源操作系统&#xff0c;专门针对嵌入式ARM平台进行优化和定制。Armbian可以运行在多种不同的嵌入式设备上&#xff0c;例如树莓派、ArmSoM、香蕉派等等。Armbian针对不同的嵌入式平台&#xff0c;提供了相应的硬件支持&a…