使用 for 循环将地址字符串中的单词替换为字典值
Replace a word in an address string with dictionary value using for-loop
我有一个地址 2300 S SUPER TEMPLE PL
,我希望在将 PL 拼写为 PLACE 后得到 2300 S SUPER TEMPLE PLACE
结果。我有一本缩写街道名称的字典:
st_abbr = {'DR': 'DRIVE',
'RD': 'ROAD',
'BLVD':'BOULEVARD',
'ST':'STREET',
'STE':'SUITE',
'APTS':'APARTMENTS',
'APT':'APARTMENT',
'CT':'COURT',
'LN' : 'LANE',
'AVE':'AVENUE',
'CIR':'CIRCLE',
'PKWY': 'PARKWAY',
'HWY': 'HIGHWAY',
'SQ':'SQUARE',
'BR':'BRIDGE',
'LK':'LAKE',
'MT':'MOUNT',
'MTN':'MOUNTAIN',
'PL':'PLACE',
'RTE':'ROUTE',
'TR':'TRAIL'}
使用 for 循环,我想替换拼写地址中的键。我想我应该做的是遍历地址中的每个单词,因此我有 address.split(),如果拆分匹配字典中的一个键,则用拼写的单词替换它。
for key in st_abbr.keys():
if key in address.split():
address = address.replace(key, st_abbr[key])
print(address)
它非常适合缩写街道名称,但这是我得到的结果 2300 S SUPER TEMPLACEE PLACE
。它还将 'TEMPLE' 中的 PL 替换为 PLACE,因此它给了我 'TEMPLACEE'。如果 street.split() 与 dict.keys() 完全匹配,我正在尝试修改 for 循环以仅替换缩写的街道。我想要有关如何实现该目标的指导。
使用理解:
addr = '2300 S SUPER TEMPLE PL'
new_addr = ' '.join(st_abbr.get(c, c) for c in addr.split())
print(new_addr)
# Output
2300 S SUPER TEMPLE PLACE
Can you shed a light the concept behind the .get(c,c) in the context of my problem?
# Equivalent code
' '.join(st_abbr[c] if c in st_abbr else c for c in addr.split())
不确定这是否是最好的主意,但正则表达式通常在这些情况下很有用:
import re
def getValue(value):
before = value.group(1)
name = value.group("name")
after = value.group(3)
if name in st_abbr:
return before + st_abbr[name] + after
else:
return before + name + after
myString = "2300 S SUPER TEMPLE PL"
re.sub("(^|\s)+(?P<name>[A-Z]{2,4})($|\s)", getValue,myString)
输出
2300 S SUPER TEMPLE PLACE
我有一个地址 2300 S SUPER TEMPLE PL
,我希望在将 PL 拼写为 PLACE 后得到 2300 S SUPER TEMPLE PLACE
结果。我有一本缩写街道名称的字典:
st_abbr = {'DR': 'DRIVE',
'RD': 'ROAD',
'BLVD':'BOULEVARD',
'ST':'STREET',
'STE':'SUITE',
'APTS':'APARTMENTS',
'APT':'APARTMENT',
'CT':'COURT',
'LN' : 'LANE',
'AVE':'AVENUE',
'CIR':'CIRCLE',
'PKWY': 'PARKWAY',
'HWY': 'HIGHWAY',
'SQ':'SQUARE',
'BR':'BRIDGE',
'LK':'LAKE',
'MT':'MOUNT',
'MTN':'MOUNTAIN',
'PL':'PLACE',
'RTE':'ROUTE',
'TR':'TRAIL'}
使用 for 循环,我想替换拼写地址中的键。我想我应该做的是遍历地址中的每个单词,因此我有 address.split(),如果拆分匹配字典中的一个键,则用拼写的单词替换它。
for key in st_abbr.keys():
if key in address.split():
address = address.replace(key, st_abbr[key])
print(address)
它非常适合缩写街道名称,但这是我得到的结果 2300 S SUPER TEMPLACEE PLACE
。它还将 'TEMPLE' 中的 PL 替换为 PLACE,因此它给了我 'TEMPLACEE'。如果 street.split() 与 dict.keys() 完全匹配,我正在尝试修改 for 循环以仅替换缩写的街道。我想要有关如何实现该目标的指导。
使用理解:
addr = '2300 S SUPER TEMPLE PL'
new_addr = ' '.join(st_abbr.get(c, c) for c in addr.split())
print(new_addr)
# Output
2300 S SUPER TEMPLE PLACE
Can you shed a light the concept behind the .get(c,c) in the context of my problem?
# Equivalent code
' '.join(st_abbr[c] if c in st_abbr else c for c in addr.split())
不确定这是否是最好的主意,但正则表达式通常在这些情况下很有用:
import re
def getValue(value):
before = value.group(1)
name = value.group("name")
after = value.group(3)
if name in st_abbr:
return before + st_abbr[name] + after
else:
return before + name + after
myString = "2300 S SUPER TEMPLE PL"
re.sub("(^|\s)+(?P<name>[A-Z]{2,4})($|\s)", getValue,myString)
输出
2300 S SUPER TEMPLE PLACE