Nat*_*ard 4 regex perl greedy cjk street-address
我对正则表达式很有经验,但我对当前涉及析取的应用程序有一些困难.
我的情况是这样的:我需要根据地址的"标识符元素"上的正则表达式匹配将地址分成其组成部分 - 类似的英语示例可能是"state","road"或" boulevard" - 例如,我们在地址中写了这些内容.想象一下,我们有一个类似下面的地址,其中(这在英语中永远不会发生),我们在每个名称后面指定了标识符类型
United States COUNTRY California STATE San Francisco CITY Mission STREET 345 NUMBER
(CAPS中的单词是我所谓的"标识符").
我们想将其解析为:
United States COUNTRY
California STATE
San Francisco CITY
Mission STREET
245 NUMBER
好吧,这对于英语来说当然是设计的,但这里有一个问题:我正在处理中文数据,实际上这种标识符规范的风格一直在发生.以下示例:
??-? ; ??-? ; ??-? ; ??-? ; ??-? ;
Yunnan-Province ; LiJiang-City ; GuCheng-District ; Xi'An-Street ; Yangchun-Alley
这很容易 - 对潜在的候选标识符名称进行惰性匹配,分为分离列表.
对于中国,以下是"省级"实体:
? (Province) ,
??? (Autonomous Region) ,
? (Municipality)
所以我的正则表达式到目前为止看起来像这样:
(.+?(?:(?:?)|(?:???)|(?:?)))
我有一系列这些,以便考虑地址的不同部分.例如,对应于城市的下一级是:
(.+?(?:(?:??)|(?:???)|(?:?)|(?:?)))
因此,要匹配省实体,然后是城市实体:
(.+?(?:(?:?)|(?:???)|(?:?)))(.+?(?:(?:??)|(?:???)|(?:?)|(?:?)))
使用命名捕获组:
(?<Province>.+?(?:(?:?)|(?:???)|(?:?)))(?<City>.+?(?:(?:??)|(?:???)|(?:?)|(?:?)))
对于上述情况,这会产生:
$+{Province} = ???
$+{City} = ???
这一切都很好,并且让我相当远.然而,问题是当我尝试考虑可以是其他标识符的子字符串的标识符时.例如,一个共同的街道级实体是"村委会",这意味着村组委会.在我希望分开的地址集中,并非每个地址都完全写出来.事实上,我发现"村委"和普通的"村".
问题?如果我对这些元素有一个纯粹的分离,我们有以下几点:
(?<Street>.+?(?:(?:???)|(?:??)|(?:?)))
但是,如果你有一个实体保定 - 村委会(保定村组委会),那么这个懒惰的正则表达式会在村里停止并称之为一天,因为村是潜在的分离元素之一.
想象一下如下的英语等价物:
(?<Animal>.+?(?:(?:Cat)|(?:Elephant)|(?:CatElephant)|(?:City)))
我们有两个输入字符串:
1."crap catelephant crap city",我们想要"Crap catelephant"和"废话城市"2."crap catelephant city",我们想要"垃圾猫""大象城"
啊,你说的解决方案就是让前标识符捕获变得贪婪.但!有些实体具有相同的标识符,不在同一级别.
以市为例.这意味着简单的"城市".但在中国,有县级,省级和市级城市.如果此字符在字符串中出现两次,尤其是在两个相邻实体中,则贪婪搜索会错误地将贪婪匹配标记为第一个实体.如下所示:
??-? ; ??-? ; ??-? ; ??-? ???-?
Guangdong-province ; Jiangmen-City ; Kaiping-City ; Sanbu-District ; Shihaiguan-District
(注意,如上所述,这是手动分段的.原始数据只有一串连接的字符)
贪婪搜索的匹配将是
??????
这是错误的,因为两个相邻的实体应该分成它们的组成部分.曾经是省级城市,一个是县级城市.
回到原点,我感谢你阅读这篇文章,是否有办法对析取实体进行加权?我希望正则表达式首先找到最高的"加权"标识符.村委会代替简单村,例如"catelephant"而不仅仅是"猫".在初步实验中,正则表达式解析器显然从左到右进行查找析取匹配.这是一个有效的假设吗?我应该将最常出现的标识符放在析取列表中吗?
如果我丢失了任何有中文相关细节的人,我会道歉,如果需要可以进一步澄清.这个例子真的不一定是中文 - 我更普遍地认为这是一个关于正则表达式析取匹配的机制的问题 - 它以什么顺序偏好析取实体,以及它如何决定何时"称之为"一天"在懒惰搜索的背景下?
在某种程度上,懒惰和贪婪的搜索之间是否存在某种中间立场?找到最长/最高加权析取实体之前可以找到的最小位?懒惰,但如果你可以为了彻底而付出额外的努力呢?(顺便说一下,我在大学时的工作理念?)
归档时间: |
|
查看次数: |
434 次 |
最近记录: |