正则表达式如何捕获有限集合中关键字之前的所有部分,但有时仅用一个空格分隔



这个问题与PCRE正则表达式有关。

我的大数据集的一部分是这样的地址数据:

12H MARKET ST. Canada
123 SW 4TH Street     USA
ONE HOUSE                       USA
1234 Quantity Dr          USA  
123 Quality Court          Canada 
1234 W HWY 56A                 USA   
12345 BERNARDO CNTR DRIVE      Canada  
12 VILLAGE PLAZA              USA  
1234 WEST SAND LAKE RD ?567    USA
1234 TELEGRAM BLVD SUITE D      USA  
1234-A SOUTHWEST FRWY          USA
123 CHURCH STREET              USA
123 S WASHINGTON               USA   
123 NW-SE BLVD                USA 
#                              USA
1234 E MAIN STREET USA    

我想从这些记录中提取街道名称,包括门牌号码和其他信息。(当然,这些记录中还有其他内容,我已经知道如何提取它们了(。

出于这个问题的目的,我只是手动地从这个例子的数据中截取了有趣的部分。

地址部分的字数以前是未知的。到目前为止,我发现的唯一标准是找到属于某个有限集的国家名称的出现,当然这个有限集比(美国|加拿大(大。为了简洁起见,我仅以这两个国家为例。

这个正则表达式

([a-zA-Z0-9?-#.]+s)

已经隔离了构成我追求的东西的单词,包括它们后面的一个空格。不幸的是,在某些情况下,要提取的街道信息后面的国家与国家仅相隔一个空格,例如在第一个和最后一个示例中。

由于我想捕捉粘贴在一起的匹配部分,所以我在正则表达式后面放置了一个+符号:

([a-zA-Z0-9?-#.]+s)+

但在这两个国家面前只有一个分隔空间的恶劣案例中,国家也被抓住了!

由于我从数据中了解了可能的国家,我可以尝试通过这样的前瞻性条件来排除它们:

([a-zA-Z0-9?-#.]+s)(?!USA|Canada)

其将CCD_ 2从第一行中的匹配中排除并且将CCD_。当然,单个捕获组还没有因此而粘在一起。所以我会在左边的组上加一个加号:

([a-zA-Z0-9?-#.]+s)+(?!USA|Canada)

但后来ST.STREET和国家,只隔了一个空格,又和国家一起被抓住了,我想把它排除在我的结果之外!

在这种情况下,你将如何处理

如果可以正确地使用正则表达式将每个国家名称替换为前面加一个空格的相同国家名称(甚至只在其中一个国家名称前面只有一个空格(,我的问题就会解决。但我想避免在单独的运行中替换整个数据库,因为国家名称可能也会出现在其他列中。

我对正则表达式很陌生,不知道如何对同一个输入按顺序执行两个处理步骤。-但也许,有人对如何应对这个问题有更好的想法。

如果我理解正确,您希望所有内容都在国家/地区之前(不包括国家/地区前面的空格(。这个国家将永远出现在队伍的最后,并来自一个名单。

因此,您应该能够设置"global"one_answers"multiline"选项,然后使用以下正则表达式:

^(.*?)(?=s+(USA|Canada)s*$)

解释

^(.*)匹配从行开始的所有字符

(?=s+(USA|Canada)s*$)向前看一个或多个spaces,后面跟着一个国家名称,后面跟着零个或更多spacesend of line

这应该会给你一个包含所有地址的列表。

编辑

我已将第一部分更改为:(.*?),使其成为non-greedy。这样,比赛将在国家队之前的最后一个字母处结束,而不是包括一些空格。

最新更新