使用RegEx解析街道地址

问题描述 投票:0回答:2

我知道这个话题有很多问题。我正在尝试从html页面中解析和获取街道地址。这些页面的格式不遵循任何模式。谁能帮我想出一个能匹配街道地址的regex,不管它们之间有多少标签?除了使用正则表达式之外,还有没有其他方法可以做到这一点?

java regex street-address
2个回答
3
投票

我在SmartyStreets工作过,对这个问题很了解,我可以告诉你。"没有"来解析用regex查找街道地址。.

地址不是一种常规语言,而且 不能 通过正则表达式进行匹配。

为了解决这个问题,我们开发了 一个实际寻找和提取地址的API准确率非常高。小批量使用是免费的。(它是 一个容易解决的问题)。) 你可以在主页演示中免费试用。不,这不是一个招标。如果你想了解更多关于街道地址的任何数量的细节,从非常基本的到非常技术性的,就给我们发邮件吧,因为我们想教育社区关于地址的知识。

为了提取地址,下面有正则表达式,但结果强烈地偏向于那些真正的地址。验证,意思是实际存在的。换句话说,这是一个解析器,执行复杂的操作来寻找和匹配地址。

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

What 6 Extracted Street Addresses Look Like


2
投票

在你变得很传统之前,让我分享一下我的经验。我在Java中用这种方式解析了100多万个网页。当我需要从一个网页中取出小片段时,如果配合替换来剥离标签,那就完美了。事实上,它的效率更高,速度更快,尤其是使用Java伟大的replaceAll()函数来剥离标签的时候。把两者建立一个fork join池,然后测试一些解析,你一定不会相信自己的眼睛。我在最后加上了这部分。这不是完整的regex,而是一个起点,因为需要一些试错来构建。我相信当时的说法是,一堆页面,没有明确的地址路线。

所以,是的,方法是有的。下面介绍一下用regex来思考这个问题。

词和词组总是有模式的,否则就读不懂。不过,还是要注意几个问题。地址可以非常大,所以继续建立出一个regex很重要。接下来的事情,如果你能接触到CAS引擎,就用它来处理你得到的任何东西。它可以使你的地址标准化。

作为必须的,你有没有试过xml,它会缩小一切,可以帮助你在格式化之前摆脱标签。你需要缩小一切。如果你使用java或python,在ForkJoinPool或MultiprocessingPool中运行这一步。

你的过程应该是

  1. 如果可能的话,缩小范围
  2. 执行一个利用格式化的regex。

最后,这里是一个 regex小抄。

请记住。我不知道你使用的是什么网站或他们的格式。我个人不得不用不同的每个网站的regex来提取这些数据,但那是针对奇怪的格式和其他网站存在的问题,这些网站像数据库一样运行着各种各样的数据。

也就是说,一个地址的格式是数字,然后是街道地址和几乎任何东西的公寓号,然后是城市,州,然后是邮政编码。基本上就是\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. 每个网站写一个formatter脚本来做清理,使用单线程或多线程来替换你不需要的东西。

你可能也需要把html剥离出来。在replace语句中运行这个regex就可以做到这一点。

<.*?>

如果你有问题,可以使用类似 我的regex测试器 (网站不是我自己的)来建立你的regex。

© www.soinside.com 2019 - 2024. All rights reserved.