使用RegEx解析街道地址

我知道有很多关于这个主题的问题。 我正在尝试从html页面解析并获取街道地址。 这些页面的格式不遵循任何模式。 有人可以帮助我提出一个与街道地址相匹配的正则表达式,而不管它们之间的标签数量是多少? 除了使用正则表达式之外,还有其他方法吗?

在SmartyStreets中非常广泛地解决了这个问题,我会告诉你用正则表达式解析/查找街道地址“ ” 。

地址不是常规语言, 不能与正则表达式匹配。

为了解决这个问题,我们开发了一个实际查找和提取地址的API ,具有非常高的准确性。 它可以免费使用。 (这不是一个容易解决的问题。)您可以在主页演示中免费试用。 不,这不是招揽。 如果您想了解更多关于街道地址的详细信息,从最基本到非常技术,请发送电子邮件给我们,因为我们希望向社区宣传地址。

为了提取地址,在引擎盖下有正则表达式,但结果偏向于实际validation的结果 ,这意味着实际存在。 换句话说,这是一个执行复杂操作以查找和匹配地址的解析器。

对一个非常相似的问题的答案是相关的,你可能会发现它很有用。 其他答案突出了一些关于解析街道地址的困难和解决方案的重要观点……

在此处输入图像描述

在你获得所有传统之前,让我分享一下我的经验。 我用Java以这种方式解析了超过100万个网页。 当我需要从页面中取出小块时,与替换条带标签配对时是完美的。 事实上,它更有效,更快,特别是在使用Java的极好的replaceAll()函数来剥离标签时。 构建一个fork连接池并测试一些解析,你不会相信你的眼睛。 我最后添加了那个部分。 这不是完整的正则表达式,而是一个起点,因为它需要一些试验和错误来构建。 我相信这句话是一堆没有明确路线的页面。

所以,是的,有办法。 以下是在正则表达式中考虑这一点的一些介绍。

单词和单词组总是处于模式中,否则它们不可读。 不过,有几点需要注意。 地址可以非常大,因此继续构建正则表达式非常重要。 接下来,如果您可以访问CAS引擎,请将其用于您获得的任何内容。 它标准化了您的地址。

作为必须,你尝试过xml,它会缩小所有内容,并且可以在格式化之前帮助摆脱标签。 你需要缩小一切。 如果您使用的是java或python,请在ForkJoinPool或MultiprocessingPool中运行此步骤。

你的过程应该是:

  1. 尽可能缩小
  2. 执行利用格式化的正则表达式

最后,这是一个正则表达式备忘单。

记住。 我不知道您使用的是哪些网站或其格式。 我个人不得不使用不同的每个站点正则表达式来提取这些数据,但这是针对奇怪的格式以及运行类似某种数据库的网站的其他问题。

也就是说,一个地址有一个数字的格式,然后街道地址和公寓号几乎任何东西,然后城市,州,然后邮政编码。 基本上它是\ d +然后是字母和数字的任何组合。

所以(在带有双反斜杠的java中)让你开始:

[\\d]+[A-Za-z0-9\\s,\\.]+ 

如果您想从不开始使用xml开始但排除标签以缩小搜索范围,请使用:

 (?<=start)[\\d]+[A-Za-z0-9\\s,\\.]+?(?=end) 

Html页面似乎总是有标签,所以就像这样

 (?<=>)[\\d]+[A-Za-z0-9\\s,\\.]+?(?=<) 

如果有多部分邮政编码,您可以使用邮政编码作为结束地点。

 [\\d]+[A-Za-z0-9\\s,\\.]+?[\\d\\-]+ 

最后,您可以将正则表达式与管道分隔符链接在一起,例如:

 (?<=start)[\\d]+[A-Za-z0-9\\s,\\.]+?[\\d\\-]+|(?<=start)[A-Za-z0-9\\s,\\.]+?(?=end) 

如果这不够窄,还有几个额外的步骤:

  1. 比较你的结果(平均字长等),并抛弃任何伟大的exception值
  2. 为每个站点编写一个格式化程序脚本来进行清理,使用单线程或multithreading来替换您不需要的东西。

你可能也需要删除html。 在替换语句中运行此正则表达式来执行此操作。

 <.*?> 

如果您遇到问题,请使用我的正则表达式测试程序 (不是我自己的网站)来构建您的正则表达式。