嘿 我想知道如何在Python / Ruby的字符串中找到街道地址?
也许是正则表达式?
此外,它将采用以下格式(美国)
420 Fanboy Lane,Cupertino CA
谢谢!
答案 0 :(得分:4)
也许你想看看pypostal。 pypostal是libpostal的官方Python绑定。
以Mike Bethany的例子为例,我做了一个小例子:
from postal.parser import parse_address
addresses = [
"420 Fanboy Lane, Cupertino CA 12345",
"1829 William Tell Oveture, by Gioachino Rossini 88421",
"114801 Western East Avenue Apt. B32, Funky Township CA 12345",
"1 Infinite Loop, Cupertino CA 12345-1234",
"420 time!",
]
for address in addresses:
print parse_address(address)
print "*" * 60
> [(u'420', u'house_number'), (u'fanboy lane', u'road'), (u'cupertino', u'city'), (u'ca', u'state'), (u'12345', u'postcode')]
> ************************************************************
> [(u'1829', u'house_number'), (u'william tell', u'road'), (u'oveture by gioachino', u'house'), (u'rossini', u'road'), (u'88421',
> u'postcode')]
> ************************************************************
> [(u'114801', u'house_number'), (u'western east avenue apt.', u'road'), (u'b32', u'postcode'), (u'funky', u'road'), (u'township',
> u'city'), (u'ca', u'state'), (u'12345', u'postcode')]
> ************************************************************
> [(u'1', u'house_number'), (u'infinite loop', u'road'), (u'cupertino', u'city'), (u'ca', u'state'), (u'12345-1234',
> u'postcode')]
> ************************************************************
> [(u'420', u'house_number'), (u'time !', u'house')]
> ************************************************************
答案 1 :(得分:2)
使用您的示例这是我在Ruby中提出的(我编辑它包含邮政编码和可选的+4 ZIP):
regex = Regexp.new(/^[0-9]* (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?$/)
addresses = ["420 Fanboy Lane, Cupertino CA 12345"]
addresses << "1829 William Tell Oveture, by Gioachino Rossini 88421"
addresses << "114801 Western East Avenue Apt. B32, Funky Township CA 12345"
addresses << "1 Infinite Loop, Cupertino CA 12345-1234"
addresses << "420 time!"
addresses.each do |address|
print address
if address.match(regex)
puts " is an address"
else
puts " is not an address"
end
end
# Outputs:
> 420 Fanboy Lane, Cupertino CA 12345 is an address
> 1829 William Tell Oveture, by Gioachino Rossini 88421 is not an address
> 114801 Western East Avenue Apt. B32, Funky Township CA 12345 is an address
> 1 Infinite Loop, Cupertino CA 12345-1234 is an address
> 420 time! is not an address
答案 2 :(得分:0)
\d{1,4}( \w+){1,3},( \w+){1,3} [A-Z]{2}
尚未经过全面测试,但应该可以使用。只需将其与re
中您最喜欢的功能一起使用(例如re.findall
。假设:
答案 3 :(得分:0)
好的,基于非常有帮助的Mike Bethany和Rafe Kettler的回复(谢谢!) 我得到这个REGEX适用于python和ruby。 / [0-9] {1,4}(。),(。)[a-zA-Z] {2} [0-9] {5} /
Ruby代码 - 12 Argonaut Lane,Lexington MA 02478的结果
myregex=Regexp.new(/[0-9]{1,4} (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?/)
print "We're Having a pizza party at 12 Argonaut Lane, Lexington MA 02478 Come join the party!".match(myregex)
Python代码 - 完全不同,但这是基本代码。
import re
myregex = re.compile(r'/[0-9]{1,4} (.*), (.*) [a-zA-Z]{2} [0-9]{5}(-[0-9]{4})?/')
search = myregex.findall("We're Having a pizza party at 12 Argonaut Lane, Lexington MA 02478 Come join the party!")
答案 4 :(得分:0)
如上所述,地址非常自由。而不是REGEX方法如何提供准确,标准化的地址数据的服务?我为SmartyStreets工作,在那里我们提供了一个可以做到这一点的API。一个简单的GET请求,你已经解析了你的地址。试试这个python样本(你需要开始trial):
答案 5 :(得分:0)
以下是我使用的内容:
(\d{1,10}( \w+){1,10}( ( \w+){1,10})?( \w+){1,10}[,.](( \w+){1,10}(,)? [A-Z]{2}( [0-9]{5})?)?)
它并不完美且与边缘情况不匹配,但它适用于大多数常规类型的地址和部分地址。
它在文本中找到地址,例如
嗨!我在弗吉尼亚州圣费尔法克斯市的12567号。快来找我!
一些文字12567 Some St.是我的家
别的东西123 My Street Drive,Fairfax VA 22033
希望这有助于某人