使用 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