【发布时间】:2013-10-12 20:31:53
【问题描述】:
我需要解析一些法律文件以找到其中的地址。下面是一个例子
test = "9999 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 123 some ave 12 st, some city, NY , 10005 nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse 124 some ave 12 st, some city, NY, 10005cillum dolore eu fugiat nulla pariatur. Exceptioneur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est labourum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed125 some ave 12 st, some city, NY, 10005 do eiusmod tempor incididunt ut labore 126 SOMETHING SOMETHING, SOME CITY, NEW YORK et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Exceptioneur sint occaecat cupidatat不显眼,在 culpa qui officia deserunt mollit anim id est labourum 中失职。”
tmp = test.scan(/(\d{3,6})(.*?)(\d{5})/)
tmp.each do |t|
puts t.join()
end
通常,地址以数字开头,以邮政编码结尾,但在这些文档中并非总是如此。
问题是我错过了一些并得到了一些不需要的结果,例如:
9999 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 123 some ave 12 st, some city, NY, 10005
124 some ave 12 st, some city, NY, 10005
125 some ave 12 st, some city, NY, 10005
126 SOMETHING SOMETHING, SOME CITY, NEW YORK et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum 11111
我想要的是以下 4 项的数组:
123 some ave 12 st, some city, NY, 10005
124 some ave 12 st, some city, NY, 10005
125 some ave 12 st, some city, NY, 10005
126 SOMETHING SOMETHING, SOME CITY, NEW YORK
至于最后一项,我很确定所有像这样格式化的地址都会以“纽约”或“纽约”结尾。
我认为我的目标模式是:
/(ANY DIGITS BETWEEN 3 AND 6)(AT LEAST 3 WORDS BUT NOT MORE THAN 10)((TRY FIRST ZIPCODE)|(IF NO ZIP CODE THEN TRY "NEW YORK" OR "NY"))/i
任何帮助将不胜感激。
【问题讨论】:
-
查看这个问题和 Matt 的回答:stackoverflow.com/questions/9397485/regex-street-address-match
-
查看了 smarty street,很棒的应用程序,但它从我的帐户中扣除的地址比它发现的要多,因此在解析应该产生 3 个有效地址的实际文档时,它消耗了 7 个请求。以这样的速度,成本太高了。此外,它还遗漏了看起来像“someText127 some street, some city, NY, 10005”的地址,请注意文本和门牌号开始位置之间没有空格。
-
对。正如链接的答案所述,街道地址不是常规语言。仅使用正则表达式从法律文件中可靠地提取街道地址是不可行的。它很容易出错。
标签: ruby-on-rails regex