在 Ruby 中解析街道地址

2023-12-28

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

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

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

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

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

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

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


如果可能的话,我建议使用库,因为地址解析可能很困难。查看因迪里佐 https://github.com/daveworth/IndirizzoRuby gem,这让这变得简单:

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

即使你don't使用 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/
}

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

  • https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/address.rb https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/address.rb
  • https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/constants.rb https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/constants.rb
  • https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/numbers.rb https://github.com/daveworth/Indirizzo/blob/master/lib/indirizzo/numbers.rb

(但我也普遍同意 @drhenner 的评论,为了让自己更轻松,您可能只需在单独的字段中接受这些数据输入。)

Edit:要给出有关如何删除街道后缀(例如“Blvd”)的更具体答案,您可以使用 Indirizzo 的正则表达式常量(例如Suffix_Type from 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”替代项,因为无论如何我们都会丢弃后缀。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ruby 中解析街道地址 的相关文章

  • Ruby 中的关键字在哪里定义?

    我正在查看 Ruby 文档 想知道是否一切都是对象 那么 关键字 也是对象 对吗 如果是这样 它们在 ruby 中是在哪里定义的 下面的页面完全让我困惑 因为它显示了包含所有关键字的对象 但这不是所有类使用的官方对象 这是否以某种方式来自不
  • Python itertools groupby 中令人不安的奇怪行为/错误?

    我在用itertools groupby解析一个短的制表符分隔的文本文件 文本文件有几列 我想做的就是对具有特定值的所有条目进行分组x在特定的列中 下面的代码对名为的列执行此操作name2 寻找变量中的值x 我尝试使用以下方法来做到这一点c
  • 在 Rails 中强制内联渲染 PDF 文档

    我正在编写一个从一组 XML 文件生成 PDF 文件的服务 正在正确生成 PDF 但是 每次我单击 查看 PDF 链接时 浏览器都会要求用户下载 PDF 文件 我需要 PDF 内联显示 就像任何常规 HTML 页面一样 我虽然我写的代码是正
  • 优化正则表达式以过滤数千个 HTML 选择选项

    背景 我开发了一个基于 jQuery 的穿梭小部件 https stackoverflow com a 13557000 59087对于 HTMLselect元素 因为我找不到一个经过最低限度编码并提供正则表达式过滤器来补偿的元素变音符号
  • xpath+ 正则表达式:匹配文本

    我正在尝试编写一个 xpath 以便仅返回包含文本和数字的节点 我想使用正则表达式并希望这能起作用 td matches text d 谁能帮我理解我在这里做错了什么 tr td 1 td td 10 td td a td tr 你缺少量化
  • R正则表达式获取第二个下划线之前的所有文本

    s lt 1 343 43Hello 2 323 14 fdh 99H 在 R 中 我想使用正则表达式来获取第二个下划线之前的子字符串 如何使用一个正则表达式来完成此操作 另一种方法是用 分割 然后粘贴前两个 一些东西 paste sapp
  • Rspec 控制器测试,传递 JSON 参数

    我试图实现以下目标 在 RSpec 控制器测试中创建 POST json 请求 并向其传递参数 这是我的代码 it returns access token do post login email bla password bla1 for
  • 将 Twitter 引导样式添加到 Rails 表单助手

    在阅读建议我使用带有引导程序集成的 Simple form gem 的答案后 我安装了它并根据 simple form 说明创建了我的表单 但输入框向右浮动 这是布局 正在使用部分 shared reg 调用该表单 div class co
  • 正则表达式和 ios5 stringByMatching ==> NSRegularExpression

    如何使用等效的 NSRegularExpression 更改此行 NSString encodedPoints apiResponse stringByMatching points capture 1L 谢谢 请记住 您需要 iOS 4
  • 无法在 IE 上运行 Selenium 脚本

    我必须在 IE 10 浏览器上运行 Selenium 测试 为了运行以下脚本 我执行了以下操作 下载IEDriverServer 64位 因为我的机器是64位 here http code google com p selenium dow
  • 使用 Vala 和 GLib 的正则表达式

    有没有一个函数 比如http php net manual en function preg match all php http php net manual en function preg match all php 使用 GLibh
  • 如何使用 java.util.regex.* 执行部分匹配?

    我一直在使用 java util regex 类来实现 Java 中的正则表达式 到目前为止一切都很好 但今天我有一个不同的要求 例如 考虑模式为 aabb 现在 如果输入字符串是 aa 它肯定不匹配 但是如果我附加 bb 它仍然有可能变成
  • Notepad++:: 通过正则表达式完全删除包含问号的行

    嗯 我想这就是我的标题 这对于我将要实现的目标来说是不言自明的 这是我当前的文本文件的示例 Diva was the winning song of the Eurovision Song Contest 1998 Who will win
  • 如何生成devise gem的注册控制器

    我已经设置了 Devise 我已经在 user rb 文件中设置了以下代码 def self create auto password generated password Devise friendly token first 8 sel
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • 正则表达式 - 从行首和行尾修剪空格[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Link
  • 如何使用 rspec 测试条件 ActiveRecord after_update 回调?

    我有一个触发作业的条件回调 如果经理发生变化 则应调用该方法 class Employee lt ActiveRecord Base after update employee manager on change if employee i
  • Jekyll 站点仅在推送到 GitHub 时才会失败

    我正在使用 Jekyll 开发一个新版本的静态网站 该网站通过 Github 页面部署 https devcampy com https devcampy com 存储库 https github com gianarb devcampy
  • ActiveRecord 布尔验证接受非布尔值

    我正在尝试验证属性是否为布尔值 即 true 或 false 从我期望的 Rails 指南中 validates new out of stock inclusion in true false 可以工作 但它接受非布尔值 例如 Hi 作为
  • 使用 tweetstream 守护进程写入数据库

    我正在尝试将与关键字匹配的所有推文写入我的数据库 我在中设置了以下内容tracker rb require rubygems require tweetstream TweetStream Daemon new Bill Gates mon

随机推荐