gpt4 book ai didi

ruby-on-rails - 在 Ruby 中解析街道地址

转载 作者:数据小太阳 更新时间:2023-10-29 06:57:08 24 4
gpt4 key购买 nike

我正在将地址处理成它们各自的数据库字段格式。我可以得到门牌号和街道类型,但试图确定最好的方法来获得没有号码和最后一句话的街道。收到的标准街道地址为:

    res[:address] = '7707 Foo Bar Blvd'

到目前为止,我可以解析以下内容:

    house = res[:address].gsub(/\D/, '')
street_type = res[:address].split(/\s+/).last

我的第一个挑战是如何获得“Foo Bar”。请注意,街道名称可以是一个、两个或三个单词。我正在努力在 Ruby 中为此找到一个单行表达式解决方案。

我的第二个问题是如何改进“房屋”代码以处理末尾有 alpha 的房屋号码。例如,“7707B”。

最后,如果您可以引用一个好的备忘单,其中包含这些表达式的示例,那将会很有帮助。

最佳答案

如果可能的话,我建议为此使用一个库,因为地址解析可能很困难。查看Indirizzo Ruby gem,这使得这很容易:

require 'Indirizzo'
address = Indirizzo::Address.new("7707 Foo Bar Blvd")
address.number
=> "7707"
address.street
=> ["foo bar blvd", "foo bar boulevard"]

即使您使用 Indirizzo 库本身,通读其源代码对于了解他们如何解决问题也可能非常有用。例如,它具有经过微调的正则表达式以匹配地址的不同部分:

Match = {
# FIXME: shouldn't have to anchor :number and :zip at start/end
:number => /^(\d+\W|[a-z]+)?(\d+)([a-z]?)\b/io,
:street => /(?:\b(?:\d+\w*|[a-z'-]+)\s*)+/io,
:city => /(?:\b[a-z][a-z'-]+\s*)+/io,
:state => State.regexp,
:zip => /\b(\d{5})(?:-(\d{4}))?\b/o,
:at => /\s(at|@|and|&)\s/io,
:po_box => /\b[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\b/
}

这些来自其源代码的文件可以提供更多细节:

(但我通常也同意@drhenner 的评论,即为了让您自己更轻松地完成这项工作,您可能只需在单独的字段中接受这些数据输入。)

编辑:要给出有关如何删除街道后缀(例如“Blvd”)的更具体答案,您可以使用 Indirizzo 的正则表达式常量(例如 Suffix_Type 来自 constants.rb) 像这样:

address = Indirizzo::Address.new("7707 Foo Bar Blvd", :expand_streets => false)
address.street.map {|street| street.gsub(Indirizzo::Suffix_Type.regexp, '').strip }
=> ["foo bar"]

(请注意,我还将 :expand_streets => false 传递给了初始化程序,以避免同时扩展“Blvd”和“Boulevard”替代项,因为我们无论如何都会丢弃后缀。)

关于ruby-on-rails - 在 Ruby 中解析街道地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16134877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com