Python中如何替换字符串里的子字符串?
地址缩写规范化解决方案
先把你的需求用表格整理得更清晰:
示例数据与预期结果
| S.no | 原始地址 | 预期结果 |
|---|---|---|
| 1 | 2341 blvd | 2341 Boulevard |
| 2 | 648 s Kingston rd | 648 S Kingston Road |
| 3 | sw Beverly st | SW Beverly Street |
要搞定这个问题,关键是精准匹配独立的缩写单词,避免误替换(比如不会把包含"rd"的普通单词拆改)。这里给你一套可复用的实现方案:
核心思路
用正则表达式的单词边界(\b)锁定独立的缩写,再通过映射字典批量替换成完整形式,同时处理大小写规范化。
具体实现(Python)
1. 定义缩写映射表
把需要替换的缩写和目标值整理成字典,正则模式确保只匹配单独的单词:
abbreviation_map = { r'\bblvd\b': 'Boulevard', # 匹配独立的blvd r'\brd\b': 'Road', # 匹配独立的rd r'\bst\b': 'Street', # 匹配独立的st r'\bs\b': 'S', # 匹配独立的s(南方向) r'\bsw\b': 'SW' # 匹配独立的sw(西南方向) }
2. 编写替换函数
用re.sub遍历映射表完成替换,同时忽略大小写适配不同输入:
import re def normalize_address(address): for pattern, replacement in abbreviation_map.items(): # IGNORECASE确保不管缩写是大写还是小写都能匹配 address = re.sub(pattern, replacement, address, flags=re.IGNORECASE) return address
3. 测试验证
把你的测试数据放进去跑:
test_cases = [ "2341 blvd", "648 s Kingston rd", "sw Beverly st" ] for original in test_cases: normalized = normalize_address(original) print(f"原始: {original:20} → 结果: {normalized}")
输出结果完全符合预期:
原始: 2341 blvd → 结果: 2341 Boulevard 原始: 648 s Kingston rd → 结果: 648 S Kingston Road 原始: sw Beverly st → 结果: SW Beverly Street
扩展说明
- 如果需要添加更多地址缩写(比如
n→North、e→East),直接往abbreviation_map里加键值对就行,非常灵活。 - 单词边界
\b是关键,它能确保我们只替换单独的缩写,不会影响像"broad"里的"rd"或者"blvd"出现在其他单词中的情况。
内容的提问来源于stack exchange,提问作者Harish Bhavandla




