使用RegEx解析街道地址

时间:2013-12-06 22:57:33

标签: java regex street-address

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

2 个答案:

答案 0 :(得分:3)

在SmartyStreets广泛讨论过这个问题,我会告诉你"NO" to parsing/finding street addresses with a regex

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

为了解决这个问题,我们开发了an API which actually finds and extracts addresses,具有非常高的准确性。它可以免费使用。 (这是一个容易解决的问题。)您可以在主页演示中免费试用。不,这不是招揽。如果您想了解更多关于街道地址的详细信息,从最基本到非常技术,只需给我们发电子邮件,因为我们想要向社区宣传地址。

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

This answer to a very similar question是相关的,您可能会发现它很有用。其他答案突出了一些关于解析街道地址的困难和解决方案的重要观点......

enter image description here

答案 1 :(得分:2)

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

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

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

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

您的流程应该是:

  1. 尽可能缩小
  2. 执行利用格式化的正则表达式
  3. 最后,这是一个regex cheat sheet.

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

    那就是说,一个地址有一个数字的格式,然后街道地址和公寓号几乎任何东西,然后城市,州,然后邮政编码。基本上它是\ 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. 比较你的结果(平均字长等)并抛弃任何好的异常值
    2. 为每个站点编写一个格式化程序脚本来进行清理,使用单线程或多线程来替换您不需要的内容。
    3. 您可能还需要删除html。在替换语句中运行此正则表达式来执行此操作。

      <.*?>
      

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