繁体   English   中英

使用 RegEx 解析街道地址

[英]Parsing Street Address Using RegEx

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

在您了解所有传统之前,让我分享我的经验。 我已经在 J​​ava 中以这种方式解析了超过 100 万个网页。 当我需要从页面中取出小块时,它与替换以去除标签配对时是完美的。 事实上,它更高效、更快捷,尤其是在使用 Java 伟大的 replaceAll() 函数剥离标签时。 建立一个 fork join pool 并测试一些解析,你不会相信自己的眼睛。 我在最后添加了那部分。 这不是完整的正则表达式,而是一个起点,因为构建需要一些反复试验。 我相信声明是一堆页面,没有明确的地址路线。

所以,是的,有办法。 下面是关于在正则表达式中思考这个问题的一些介绍。

单词和单词组总是在一个模式中,否则它们是不可读的。 不过,有几件事需要注意。 地址可以非常大,因此继续构建正则表达式很重要。 接下来,如果您可以访问 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. 比较您的结果(平均字长等)并剔除任何出色的异常值
  2. 为每个站点编写一个格式化程序脚本来进行清理,使用单线程或多线程来替换您不需要的内容。

您可能还需要删除 html。 在替换语句中运行这个正则表达式来做到这一点。

<.*?>

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

在 SmartyStreets 对这个问题进行了相当广泛的研究后,我会告诉你”使用正则表达式解析/查找街道地址

地址不是正则语言,无法通过正则表达式进行匹配。

为了解决这个问题,我们开发了一个API,它实际查找和提取地址,准确率非常高。 小批量使用是免费的。 (这不是一个容易解决的问题。)您可以在主页演示上免费试用。 不,这不是招揽。 如果您想详细了解从非常基础到非常技术的街道地址,请给我们发送电子邮件,因为我们希望对社区进行地址教育。

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM