加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – Perl正则表达式中的加权析取?

发布时间:2020-12-14 05:56:39 所属栏目:百科 来源:网络整理
导读:我对正则表达式很有经验,但我对当前涉及析取的应用程序有一些困难. 我的情况是这样的:我需要根据地址的“标识符元素”上的正则表达式匹配将地址分成其组成部分 – 类似的英语示例可能是“state”,“road”或“ boulevard“ – 例如,我们在地址中写了这些内
我对正则表达式很有经验,但我对当前涉及析取的应用程序有一些困难.

我的情况是这样的:我需要根据地址的“标识符元素”上的正则表达式匹配将地址分成其组成部分 – 类似的英语示例可能是“state”,“road”或“ boulevard“ – 例如,我们在地址中写了这些内容.想象一下,我们有一个类似下面的地址,其中(这在英语中永远不会发生),我们在每个名称后面指定了标识符类型

美国加利福尼亚州加利福尼亚州旧金山市使命街道345号

(CAPS中的单词是我所谓的“标识符”).

我们想将其解析为:

美国国家
加利福尼亚州
旧金山市
使命街道
245号

好吧,这对于英语来说当然是设计的,但这里有一个问题:我正在处理中文数据,实际上这种标识符规范的风格一直在发生.以下示例:

云南 – 省;丽江 – 市;古城 – 区;西安 – 街;杨春 – 巷;
云南省;丽江市;古城区;西安街;阳春胡同

这很容易 – 对潜在的候选标识符名称进行惰性匹配,分为分离列表.

对于中国,以下是“省级”实体:

省(省),
自治区(自治区),
市(市)

所以我的正则表达式到目前为止看起来像这样:

(.?(?:(?:省)|(?:自治区)|(?:市)))

我有一系列这些,以便考虑地址的不同部分.例如,对应于城市的下一级是:

(.?(?:(?:地区)|(?:自治州)|(?:市)|(?:盟)))

因此,要匹配省实体,然后是城市实体:

(.?(?:(?:省)|(?:自治区)|(?:市)))(.?(?:(?:地区)|(?:自治州)|(?:市)|( ?:盟)))

使用命名捕获组:

(?<省>.?(?:(?:省)|(?:自治区)|(?:市)))(?< City>.?(?:( ?:地区)|(?:自治州)|(?:市)|(?:盟)))

对于上述情况,这会产生:

${省} =云南省
${City} =丽江市

这一切都很好,并且让我相当远.然而,问题是当我尝试考虑可以是其他标识符的子字符串的标识符时.例如,一个共同的街道级实体是“村委会”,这意味着村组委会.在我希望分离的地址集中,并非每个地址都完全写出来.事实上,我发现“村委”和普通的“村”.

问题?如果我对这些元素进行了纯粹的分离,我们有以下内容:

(?< Street>.?(?:( ?:村委会)|(?:村委)|(?:村)))

但是,如果你有一个实体保定 – 村委会(保定村组委会),那么这个懒惰的正则表达式会在村里停止并称之为一天,因为村是潜在的分离元素之一.

想象一下如下的英语等价物:

(?< Animal>.?(?:(?:Cat)|(?:Elephant)|(?:CatElephant)|(?:City)))

我们有两个输入字符串:
1.“crap catelephant crap city”,我们想要“Crap catelephant”和“废话城市”
2.“crap catelephant city”,我们想要“废话猫”“大象城”

啊,你说的解决方案就是让前标识符捕获变得贪婪.但!有些实体具有相同的标识符,不在同一级别.

以市为例.这意味着简单的“城市”.但在中国,有县级,省级和市级城市.如果此字符在字符串中出现两次,尤其是在两个相邻实体中,则贪婪搜索会错误地将贪婪匹配标记为第一个实体.如下所示:

广东 – 省;江门 – 市;开平 – 市;三埠 – 区石海管 – 区
广东省;江门市;开平市;三埠区; Shihaiguan-区

(注意,如上所述,这是手动分段的.原始数据只有一串连接的字符)

贪婪搜索的匹配将是

江门市开平市

这是错误的,因为两个相邻的实体应该分成它们的组成部分.曾经是省级城市,一个是县级城市.

回到原点,我感谢你阅读这篇文章,是否有办法对析取实体进行加权?我希望正则表达式首先找到最高的“加权”标识符.村委会代替简单村,例如“catelephant”而不仅仅是“猫”.在初步实验中,正则表达式解析器显然从左到右进行查找析取匹配.这是一个有效的假设吗?我应该将最常出现的标识符放在析取列表中吗?

如果我丢失了任何有中文相关细节的人,我会道歉,如果需要可以进一步澄清.这个例子真的不一定是中文 – 我更普遍地认为这是一个关于正则表达式析取匹配的机制的问题 – 它以什么顺序偏好析取实体,以及它如何决定何时“称之为”一天“在懒惰搜索的背景下?

在某种程度上,懒惰和贪婪搜索之间是否存在某种中间立场?找到最长/最高加权析取实体之前可以找到的最小位?懒惰,但如果你可以为了彻底而付出额外的努力呢?
(顺便说一下,我在大学时的工作理念?)

解决方法

如何处理 alternations取决于特定的正则表达式 engine.对于几乎所有引擎(包括Perl的正则表达式引擎),交替匹配都是急切的 – 也就是说,它首先匹配最左边的选择,如果失败则仅尝试另一个替代.例如,如果你有/(猫| catelephant)/它将永远不会匹配catelephant.解决方案是重新排序选项,以便最具体的选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读