Clips入门:Python+clipspy规则匹配通配路径的正则或替代方案
解决方案
方案1:使用CLIPS内置正则匹配函数(推荐,无需改动原有事实结构)
CLIPS 6.3及以上版本支持regex-match函数,可以直接在规则的测试条件中完成路径格式校验,无需修改原有ROW模板结构。修改后的规则如下:
rule3= """ (defrule createpara (ROW (counter ?A) (ID ?id) (Text ?text) (Path ?path)) ; 将路径值绑定到变量?path ; 测试路径是否完全匹配指定格式,特殊字符需转义 (test (regex-match "^//Document/Sect\\[[0-9]+\\]/P\\[[0-9]+\\]$" ?path)) => (assert (WordPR (counter ?A) (structure ?id) (tag "PAR") (style "Paragraph") (text ?text)))) """
正则规则说明:
^和$限定整个路径字符串完全匹配格式\\[、\\]匹配字面量方括号(CLIPS字符串中斜杠需要转义,因此写为两个斜杠)[0-9]+匹配1位及以上的任意正整数,对应你需要的任意下标场景
方案2:路径字段预处理(适配低版本CLIPS/高性能场景)
如果使用的CLIPS版本不支持正则,或是事实量很大需要更高的匹配效率,可以提前解析路径字段:
- 修改ROW模板,新增
SectNum、PNum两个槽,解析路径时如果符合Sect[数字]/P[数字]格式,就把对应的数字存入两个槽,不符合则填nil - 规则直接匹配两个槽非空即可,示例如下:
; 新增槽后的ROW模板示例 (deftemplate ROW (slot counter) (slot ID) (slot Text) (slot Path) (slot SectNum) (slot PNum)) ; 修改后的规则 (defrule createpara (ROW (counter ?A) (ID ?id) (Text ?text) (SectNum ?&~nil) ; 匹配非空的Sect编号 (PNum ?&~nil)) ; 匹配非空的P编号 => (assert (WordPR (counter ?A) (structure ?id) (tag "PAR") (style "Paragraph") (text ?text))))
内容的提问来源于stack exchange,提问作者ANA
相关产品推荐
相关产品推荐

