我的任务是将非原子(澳大利亚)街道地址转换为原子地址,这意味着当前的街道数据将作为街道编号和街道名称一起存储。示例如下:
24 George street -----------> 24 | George street
55 park rd -----------> 55 | pard rd
102a gordon road -----------> 102a | gordon road
unit 5/46 addison ave -----------> unit 5/46 | addison ave
flat 2-9/87 north avenue-----------> flat 2-9/87| north avenue
suit 5 lvl2/55 prince hwy-------> suit 5 lvl2/55| prince hwy
shop 5 Big Shopping Centre ------> Rejected
Suit 2 Level 100 -------> Rejected
添加数据(程序的工作方式):
Darling street ------------------> Rejected
City road -----------------------> rejected
建议的代码处理结果:
Darling street ------------> Darling | Street
City road ---------------> City | road
实际上,在这种情况下,代码不应该处理地址并抛出异常。
拆分地址的最佳方法是什么?
发布于 2013-05-12 22:32:06
select
addr,
regexp_substr(addr, '^(.*?)\s\D+$', 1, 1, '', 1) street_number,
regexp_substr(addr, '^.*?\s+(\D*?)\s*$', 1, 1, '', 1) street_name
from t1
where -- don't show rejected
regexp_like(addr, '\d.*\s(street|road|rd|ave|avenue|hwy)\s*$', 'i')
fiddle
发布于 2013-05-14 01:48:37
我假设你已经按照同样的思路看到了这个question的答案。
@kaᵠ已经指出,程序对数据一无所知,因此它没有上下文。这种情况永远不会改变。因此,考虑到这一点,您需要确定的第一件事是您需要什么级别的准确性?如果你需要70%的准确率,那么你可以用简单的REGEX做到这一点。( regex真的很简单吗)?
如果您需要确定从输入中提取的地址实际上是真实有效的,则需要一个列表或表进行比较。这些数据将来自澳大利亚邮政(或美国的USPS )等来源。
因此,使用您的正则表达式来提取“猜测”,然后根据主列表验证这些猜测,并且匹配的是正确的。没有主列表,你就不能确定你做对了还是做错了。
实际上,我在SmartyStreets一直在研究这个完全相同的问题(除了我只处理美国地址),并提出了许多不同的解决方案-不同的方法来确定地址字符串的开始和结束,以及如何处理误报,或看起来像邮政编码的主数字。您可以使用纯REGEX,也可以使用包含邮政编码、州和街道名称的表。这使您能够非常接近于能够以高精度提取原子数据。
https://stackoverflow.com/questions/16508205
复制相似问题