HiveNetCore.formula module

字符串公式解析模块

class HiveNetCore.formula.EnumFormulaSearchResultType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Enum

检索结果类型

Dict = 'Dict'
List = 'List'
class HiveNetCore.formula.EnumFormulaSearchSortOrder(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[源代码]

基类:Enum

检索结果排序模式

ListAsc = 'ListAsc'
ListDesc = 'ListDesc'
MatchAsc = 'MatchAsc'
MatchBig = 'MatchBig'
MatchDesc = 'MatchDesc'
MatchSmall = 'MatchSmall'
class HiveNetCore.formula.FormulaTool(keywords={}, ignore_case=False, deal_fun_list={}, default_deal_fun=None)[源代码]

基类:object

公式解析处理工具

以下为类中的一些经常遇到的对象的公共定义:
match_list - {dict} - 要检索的匹配字符清单字典, 格式为:

key - string, 要匹配的字符串 value - (string[], string[]) 前置字符列表, 后置字符列表(可以一次设置多个前置字符匹配):

注意: 前置字符和后置字符都只支持1个字符, 当有两个字符时必须满足一下转义的定义:

^ : 匹配字符串开头 $ : 匹配字符串结尾 * : 匹配任意字符(也可以是前面无字符)

如果前置字符/后置字符列表长度为0, 则代表不判断前置及后置字符, 等同于’*’

match_info - {object} - 某一匹配节点信息, 为一个object:

object.source_str : string 匹配到的原文字符串 object.start_pos : int 匹配结果开始位置(不含前置字符) object.end_pos : int 匹配结果结束位置(不含后置字符) object.front_char : string 匹配到的前置字符 object.end_char : string 匹配到的后置字符

match_result - {dict} - 匹配结果字典, 格式为:

key - string, 匹配上的字符串(match_list的key) value - dict, 匹配到的结果字典, key为start_pos, value为match_info, 格式 @see FormulaTool/match_info

compare_stack - {dict} - 中间匹配结果堆栈, 格式为:

key - string, 要匹配的字符串(match_list的key) value - dict, 所有部分匹配到且未完结的匹配信息(确认已匹配上加入match_result及确认不匹配删除的除外), 格式为:

key - string, 前置字符 + 匹配开始位置(front_char+str(start_pos)) value - object, 匹配的match_info, 格式 @see FormulaTool/match_info

keywords - {dict} - 公式关键字定义, 格式如下:

key - string 关键字标识名 value - list 匹配定义数组, 按顺序定义为:

开始标签 - [string-匹配字符串, list-前置字符, list-后置字符] 结束标签 - [string-匹配字符串, list-前置字符, list-后置字符], 结束标签可以置None(表示使用匹配参数) 匹配参数 - StructFormulaKeywordPara, 对象属性为:

object.is_single_tag : bool 该标签是否单独一个标识, 不含公式内容 object.has_sub_formula : bool 是否包含子公式, 如果为True则代表继续分解公式里面的子公式 object.is_string : bool 是否字符串, 如果为True代表是字符串(字符串不包含子公式) object.string_ignore_chars : list 字符串的结束标签忽略字符, 例如[”\’”, “’’”] object.end_tags : list 当结束标签为None时, 且不是单独标签, 通过该参数获取结束标识(可以为多个字符):

$ : 以结尾为结束标签’\$’ t : 以下一个标签开始为当前结束标签’\t’, 注意不是代表tab的’t’

参数
  • ignore_case (bool) – default=False, 是否忽略大小写

  • deal_fun_list (dict) –

    default=dict(), 公式计算函数对照字典:

    key - string keywords的关键字标识名

    value - fun 对应的公式处理函数, 函数的定义必须满足以下要求:

    fun(formular_obj, **kwargs):

    formular_obj : StructFormula 要处理公式对象(函数直接修改对象), 该函数需更新对象的formula_value

    kwargs : 计算公式所传入的key=value格式的参数, 参数key由处理函数定义(建议统一定义便于简化处理)

    注意:

    1、可以在函数定义中直接指定要传入的指定参数名, 但注意函数参数的最后必须指定**kwargs, :

    避免外部统一传入的参数与指定参数不一样的情况下出错, 例如:

    def deal_fun_string(formular_obj, my_para1=’’, my_para2=[], **kwargs)

    2、如果希望传入的指定参数能在公式处理过程中被修改并传递到其他公式处理, 应该指定的参数类型不要:

    为string、int等非引用类型, 而应该使用list、dict、object等引用类型

  • default_deal_fun (function) – default=None, 默认的公式处理函数, 如果None代表默认使用default_deal_fun_string_content

__init__(keywords={}, ignore_case=False, deal_fun_list={}, default_deal_fun=None)[源代码]

构造函数

参数
  • keywords (dict) – default=dict(), 公式关键字定义, @see FormulaTool/keywords

  • ignore_case (bool) – default=False, 是否忽略大小写

  • deal_fun_list (dict) –

    default=dict(), 公式计算函数对照字典:

    key - string keywords的关键字标识名

    value - fun 对应的公式处理函数, 函数的定义必须满足以下要求:

    fun(formular_obj, **kwargs):

    formular_obj : StructFormula 要处理公式对象(函数直接修改对象), 该函数需更新对象的formula_value

    kwargs : 计算公式所传入的key=value格式的参数, 参数key由处理函数定义(建议统一定义便于简化处理)

    注意:

    1、可以在函数定义中直接指定要传入的指定参数名, 但注意函数参数的最后必须指定**kwargs, :

    避免外部统一传入的参数与指定参数不一样的情况下出错, 例如:

    def deal_fun_string(formular_obj, my_para1=’’, my_para2=[], **kwargs)

    2、如果希望传入的指定参数能在公式处理过程中被修改并传递到其他公式处理, 应该指定的参数类型不要:

    为string、int等非引用类型, 而应该使用list、dict、object等引用类型

  • default_deal_fun (function) – default=None, 默认的公式处理函数, 如果None代表默认使用default_deal_fun_string_content

add_keyword(key, begin_tag, end_tag=None, keyword_para=<HiveNetCore.formula.StructFormulaKeywordPara object>, deal_fun=None, is_replace=False)[源代码]

添加公式关键字, 如果key已存在且is_replace为True则抛出异常

参数
  • key (string) – 公式关键字标识

  • begin_tag (list) – 开始标签定义[string-匹配字符串, list-前置字符, list-后置字符]

  • end_tag (list) – default=None, 结束标签定义[string-匹配字符串, list-前置字符, list-后置字符], 如果没有结束标签为None

  • keyword_para (StructFormulaKeywordPara) – default=StructFormulaKeywordPara(), 匹配参数

  • deal_fun (function) –

    default=None, 对应key的处理函数, 函数的定义必须满足以下要求:

    fun(formular_obj, **kwargs):

    formular_obj : StructFormula 要处理公式对象(函数直接修改对象), 该函数需更新对象的formula_value

    kwargs : 计算公式所传入的key=value格式的参数, 参数key由处理函数定义(建议统一定义便于简化处理)

  • is_replace (bool) – default=False, 是否覆盖已有参数

引发

KeyError – 当is_replace为Falseqiekey已存在时抛出该异常

static analyse_formula(formula_str, keywords={}, ignore_case=False)[源代码]

解析公式并形成结构化展示字典

参数
  • formula_str (string) – 要解析的公式字符串

  • keywords (dict) – default=dict(), 公式关键字定义, @see FormulaTool/keywords

  • ignore_case (bool) – default=False, 是否忽略大小写

返回

公式分解结构对象

返回类型

StructFormula

引发

LookupError – 如果公式存在错误(例如找不到结束标签等), 抛出该异常

clear_keywords(with_deal_fun=False)[源代码]

清除公式关键字定义

参数

with_deal_fun (bool) – default=False, 是否同步清除处理函数列表

static default_deal_fun_datetime_str(formular_obj, datetime_format_str='%Y-%m-%d %H:%M:%S', **kwargs)[源代码]

默认公式计算函数-获取当前时间日期字符格式

参数
  • formular_obj (StructFormula) – 要计算的公式

  • datetime_format_str (string) –

    default=’%Y-%m-%d %H:%M:%S’, 日期时间的格式化字符串

    参考:

    %y 两位数的年份表示(00-99)

    %Y 四位数的年份表示(000-9999)

    %m 月份(01-12)

    %d 月内中的一天(0-31)

    %H 24小时制小时数(0-23)

    %I 12小时制小时数(01-12)

    %M 分钟数(00=59)

    %S 秒(00-59)

    %a 本地简化星期名称

    %A 本地完整星期名称

    %b 本地简化的月份名称

    %B 本地完整的月份名称

    %c 本地相应的日期表示和时间表示

    %j 年内的一天(001-366)

    %p 本地A.M.或P.M.的等价符

    %U 一年中的星期数(00-53)星期天为星期的开始

    %w 星期(0-6), 星期天为星期的开始

    %W 一年中的星期数(00-53)星期一为星期的开始

    %x 本地相应的日期表示

    %X 本地相应的时间表示

    %Z 当前时区的名称

    %% %号本身

static default_deal_fun_python(formular_obj, **kwargs)[源代码]

默认公式计算函数-标签内容作为python代码执行

将执行结果的对象作为设置值

参数

formular_obj (StructFormula) – 要计算的公式

static default_deal_fun_string_content(formular_obj, **kwargs)[源代码]

默认公式计算函数-标签内容转为字符串

将标签内容的字符串作为设置值

参数

formular_obj (StructFormula) – 要计算的公式

static default_deal_fun_string_full(formular_obj, **kwargs)[源代码]

默认公式计算函数-全标签转为字符串

将标签自身的字符串作为设置值

参数

formular_obj (StructFormula) – 要计算的公式

delete_keyword(key, with_deal_fun=False)[源代码]

删除指定公式关键字定义

参数
  • key (string) – 要删除的关键字标识

  • with_deal_fun (bool) – default=False, 是否同步清除处理函数列表

引发

KeyError – 当找不到key时抛出该异常

static match_result_to_sorted_list(match_result)[源代码]

将匹配结果转换为按匹配位置排序的数组

参数

match_result (dict) – 匹配结果字典, 格式 @see FormulaTool/match_result

返回

匹配位置排序好的数组, 格式为:

[

[match_str, source_str, start_pos, end_pos, front_char, end_char],

……

]

返回类型

list

reset_formula_para(keywords={}, ignore_case=False, deal_fun_list={}, default_deal_fun=None)[源代码]

重置公式处理参数

参数
  • keywords (dict) – default=dict(), 公式关键字定义, @see FormulaTool/keywords

  • ignore_case (bool) – default=False, 是否忽略大小写

  • deal_fun_list (dict) –

    default=dict(), 公式计算函数对照字典:

    key - string keywords的关键字标识名

    value - fun 对应的公式处理函数, 函数的定义必须满足以下要求:

    fun(formular_obj, **kwargs):

    formular_obj : StructFormula 要处理公式对象(函数直接修改对象), 该函数需更新对象的formula_value

    kwargs : 计算公式所传入的key=value格式的参数, 参数key由处理函数定义(建议统一定义便于简化处理)

    注意:

    1、可以在函数定义中直接指定要传入的指定参数名, 但注意函数参数的最后必须指定**kwargs, :

    避免外部统一传入的参数与指定参数不一样的情况下出错, 例如:

    def deal_fun_string(formular_obj, my_para1=’’, my_para2=[], **kwargs)

    2、如果希望传入的指定参数能在公式处理过程中被修改并传递到其他公式处理, 应该指定的参数类型不要:

    为string、int等非引用类型, 而应该使用list、dict、object等引用类型

  • default_deal_fun (function) – default=None, 默认的公式处理函数, 如果None代表默认使用default_deal_fun_string_content

run_formula(formula_str, **kwargs)[源代码]

解析并执行公式计算

参数
  • formula_str (string) – 要处理的公式

  • kwargs (**kwargs) – 传入的公式处理参数集, 动态key-value方式参数

返回

解析出来的公式对象, 并完成所有公式对象(含子对象)的formula_value计算

返回类型

StructFormula

引发

LookupError – 如果公式存在错误(例如找不到结束标签等), 抛出该异常

run_formula_as_string(formula_str, **kwargs)[源代码]

以字符串替换方式解析并执行公式计算

参数
  • formula_str (string) – 要处理的公式

  • kwargs (dict) – 传入的公式处理参数集, 动态key-value方式参数

返回

解析出来的公式对象, 并完成所有公式对象(含子对象)的formula_value计算

返回类型

StructFormula

引发

LookupError – 如果公式存在错误(例如找不到结束标签等), 抛出该异常

static search(source_str, match_list, ignore_case=False, multiple_match=True, sort_oder=EnumFormulaSearchSortOrder.MatchAsc, result_type=EnumFormulaSearchResultType.Dict)[源代码]

从字符串中检索匹配字符清单, 获取匹配结果

参数
  • source_str (string) – 需要检索的字符串

  • match_list (dict) – 要检索的匹配字符清单字典, 格式 @see FormulaTool/match_list

  • ignore_case (bool) – default=False, 是否忽略大小写

  • multiple_match (bool) – default=True, 是否支持多重匹配(即同一段字符可以被多个匹配字符所匹配上)

  • sort_oder (EnumFormulaSearchSortOrder) – default=EnumFormulaSearchSortOrder.MatchAsc, 匹配结果获取顺序, 在不支持多重匹配的情况下按该顺序保留结果

  • result_type (EnumFormulaSearchResultType) – default=EnumFormulaSearchResultType.Dict, 匹配结果类型

返回

匹配结果, 返回格式与result_type参数有关:

字典格式为:

key - string, 匹配上的字符串(match_list的key)

value - dict, 匹配到的结果字典, key为start_pos,value为一个object:

object.source_str : string 匹配到的原文字符串

object.start_pos : int 匹配结果开始位置(不含前置字符)

object.end_pos : int 匹配结果结束位置(不含后置字符)

object.front_char : string 匹配到的前置字符

object.end_char : string 匹配到的后置字符

列表格式为:

[

[match_str, source_str, start_pos, end_pos, front_char, end_char],

……

]

返回类型

dict/list

class HiveNetCore.formula.StructFormula[源代码]

基类:object

公式结构定义

content_end_pos = 0
content_start_pos = 0
content_string = ''
end_pos = 0
formula_string = ''
formula_value = ''
keyword = ''
start_pos = 0
sub_formula_list = []
class HiveNetCore.formula.StructFormulaKeywordPara[源代码]

基类:object

公式匹配关键字配置参数结构定义

end_tags = []
has_sub_formula = True
is_single_tag = False
is_string = False
string_ignore_chars = []