正则表达式 – Perl正则表达式中的加权析取?
我对正则表达式很有经验,但我对当前涉及析取的应用程序有一些困难.
我的情况是这样的:我需要根据地址的“标识符元素”上的正则表达式匹配将地址分成其组成部分 – 类似的英语示例可能是“state”,“road”或“ boulevard“ – 例如,我们在地址中写了这些内容.想象一下,我们有一个类似下面的地址,其中(这在英语中永远不会发生),我们在每个名称后面指定了标识符类型 美国加利福尼亚州加利福尼亚州旧金山市使命街道345号 (CAPS中的单词是我所谓的“标识符”). 我们想将其解析为: 美国国家 好吧,这对于英语来说当然是设计的,但这里有一个问题:我正在处理中文数据,实际上这种标识符规范的风格一直在发生.以下示例: 云南 – 省;丽江 – 市;古城 – 区;西安 – 街;杨春 – 巷; 这很容易 – 对潜在的候选标识符名称进行惰性匹配,分为分离列表. 对于中国,以下是“省级”实体: 省(省), 所以我的正则表达式到目前为止看起来像这样: (.?(?:(?:省)|(?:自治区)|(?:市))) 我有一系列这些,以便考虑地址的不同部分.例如,对应于城市的下一级是: (.?(?:(?:地区)|(?:自治州)|(?:市)|(?:盟))) 因此,要匹配省实体,然后是城市实体: (.?(?:(?:省)|(?:自治区)|(?:市)))(.?(?:(?:地区)|(?:自治州)|(?:市)|( ?:盟))) 使用命名捕获组: (?<省>.?(?:(?:省)|(?:自治区)|(?:市)))(?< City>.?(?:( ?:地区)|(?:自治州)|(?:市)|(?:盟))) 对于上述情况,这会产生: ${省} =云南省 这一切都很好,并且让我相当远.然而,问题是当我尝试考虑可以是其他标识符的子字符串的标识符时.例如,一个共同的街道级实体是“村委会”,这意味着村组委会.在我希望分离的地址集中,并非每个地址都完全写出来.事实上,我发现“村委”和普通的“村”. 问题?如果我对这些元素进行了纯粹的分离,我们有以下内容: (?< Street>.?(?:( ?:村委会)|(?:村委)|(?:村))) 但是,如果你有一个实体保定 – 村委会(保定村组委会),那么这个懒惰的正则表达式会在村里停止并称之为一天,因为村是潜在的分离元素之一. 想象一下如下的英语等价物: (?< Animal>.?(?:(?:Cat)|(?:Elephant)|(?:CatElephant)|(?:City))) 我们有两个输入字符串: 啊,你说的解决方案就是让前标识符捕获变得贪婪.但!有些实体具有相同的标识符,不在同一级别. 以市为例.这意味着简单的“城市”.但在中国,有县级,省级和市级城市.如果此字符在字符串中出现两次,尤其是在两个相邻实体中,则贪婪搜索会错误地将贪婪匹配标记为第一个实体.如下所示: 广东 – 省;江门 – 市;开平 – 市;三埠 – 区石海管 – 区 (注意,如上所述,这是手动分段的.原始数据只有一串连接的字符) 贪婪搜索的匹配将是 江门市开平市 这是错误的,因为两个相邻的实体应该分成它们的组成部分.曾经是省级城市,一个是县级城市. 回到原点,我感谢你阅读这篇文章,是否有办法对析取实体进行加权?我希望正则表达式首先找到最高的“加权”标识符.村委会代替简单村,例如“catelephant”而不仅仅是“猫”.在初步实验中,正则表达式解析器显然从左到右进行查找析取匹配.这是一个有效的假设吗?我应该将最常出现的标识符放在析取列表中吗? 如果我丢失了任何有中文相关细节的人,我会道歉,如果需要可以进一步澄清.这个例子真的不一定是中文 – 我更普遍地认为这是一个关于正则表达式析取匹配的机制的问题 – 它以什么顺序偏好析取实体,以及它如何决定何时“称之为”一天“在懒惰搜索的背景下? 在某种程度上,懒惰和贪婪搜索之间是否存在某种中间立场?找到最长/最高加权析取实体之前可以找到的最小位?懒惰,但如果你可以为了彻底而付出额外的努力呢? 解决方法
如何处理
alternations取决于特定的正则表达式
engine.对于几乎所有引擎(包括Perl的正则表达式引擎),交替匹配都是急切的 – 也就是说,它首先匹配最左边的选择,如果失败则仅尝试另一个替代.例如,如果你有/(猫| catelephant)/它将永远不会匹配catelephant.解决方案是重新排序选项,以便最具体的选择.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |