我知道有很多关于这个话题的问题。我正在尝试从 html 页面解析并获取街道地址。这些页面的格式不遵循任何模式。有人可以帮我想出一个与街道地址匹配的正则表达式,而不管它们之间的标签数量有多少吗?除了使用正则表达式之外还有其他方法吗?
最佳答案
在你了解所有传统之前,让我分享一下我的经验。我已经用 Java 以这种方式解析了超过 100 万个网页。当我需要从页面中取出小部分时,与替换以剥离标签搭配使用是完美的。事实上,它更高效、更快,特别是当使用 Java 伟大的replaceAll() 函数来剥离标签时。构建两者的 fork join 池并测试一些解析,您将无法相信自己的眼睛。我在最后添加了该部分。这不是完整的正则表达式,而是一个起点,因为构建需要一些尝试和错误。我相信该声明是一堆页面,没有明确的地址路线。
所以,是的,有办法。接下来是关于在正则表达式中思考这个问题的一些介绍。
单词和单词组始终处于某种模式中,否则将无法阅读。尽管如此,仍有几件事需要注意。地址可以非常大,因此继续构建正则表达式很重要。接下来,如果您有权使用 CAS 引擎,请将其用于您获得的任何内容。它标准化了您的地址。
作为必须的,您是否尝试过 xml,它会缩小所有内容,并有助于在格式化之前删除标签。你需要缩小一切范围。如果您使用的是 java 或 python,请在 ForkJoinPool 或 MultiprocessingPool 中运行此步骤。
您的流程应该是:
- 如果可能的话缩小范围
- 执行利用格式的正则表达式
最后,这是一个regex cheat sheet.
记住。我不知道您正在使用哪些网站或其格式。我个人不得不使用不同的每个站点正则表达式来提取这些数据,但这是针对奇怪的格式以及像某种数据库一样运行的网站所存在的其他问题。
也就是说,地址的格式是数字,然后是街道地址和公寓号(几乎任何内容),然后是城市、州,然后是邮政编码。基本上是\d+ 然后是字母和数字的任意组合。
所以(在java中带有双反斜杠)开始吧:
[\\d]+[A-Za-z0-9\\s,\\.]+
如果您想从 at 开始但排除标签以缩小搜索范围(如果不使用 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)
如果这还不够窄,还有几个额外的步骤:
- 比较您的结果(平均字长等)并剔除任何重要的异常值
- 为每个站点编写一个格式化程序脚本来进行清理,使用单线程或多线程来替换您不需要的内容。
您可能还需要删除 html。在替换语句中运行此正则表达式即可实现此目的。
<.*?>
如果遇到问题,请使用类似 my regex tester 的内容(该网站不是我自己的)来构建您的正则表达式。
关于java - 使用正则表达式解析街道地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435074/