动机
我正在解析地址,需要在单独的匹配项中获取地址和国家/地区,但这些国家/地区可能有别名,例如:
UK == United Kingdom,
US == USA == United States,
Korea == South Korea,
等等...
解释
所以,我所做的是创建一个大的正则表达式,其中所有可能的国家名称(至少更可能出现的国家名称)由 OR 运算符分隔,如下所示:
germany|us|france|chile
但问题在于多词国家名称及其较短的版本,例如:
Republic of Moldova
和Moldova
以此为例,我们有以下字符串:
'Somewhere in Moldova, bla bla, 12313, Republic of Moldova'
我想从中得到什么:
'Somewhere in Moldova, bla bla, more bla, 12313'
'Republic of Moldova'
但这就是我得到的:
'Somewhere in Moldova, bla bla, 12313, Republic of'
'Moldova'
正则表达式
由于有几种情况,这是我目前使用的:
^(.*),? \(?(republic of moldova|moldova)\)?(.*[\d\-]+.*|,.*[:/].*)?$
因为我们可能在国家名称后面有传真、电话、邮政编码或其他东西——我不在乎——我使用最后一个匹配组来删除它们:
(.*[\d\-]+.*|,.*[:/].*)?
另外,有时国家名称用括号括起来,所以我有\(?
第二\)?
个匹配组,所有国家都放在里面:
(republic of moldova|moldova|...)
问题
问题是,当有一个条目是较大条目的子集时,选择较短的条目而不是较长的条目,其余部分保留在 base_address 字符串中。当两个值匹配时,有没有办法告诉正则表达式选择最大可能的匹配?
编辑
- 我正在使用带有内置 re 模块的 Python
正如 m.buettner 所建议的,将第一个匹配组从更改
(.*)
为(.*?)
确实可以解决当前问题,但它也会创建另一个问题。考虑其他示例:'新加坡国立大学化学系,新加坡 4512436'
火柴:
'Department of Chemistry, National University of'
'Singapore'
现在它匹配得太早了。