Python如何实现字符串匹配字典替换后无多余空格正确拼接
解决方案
问题原因
- 原代码用
[A-Za-z0-9]+|\S拆分字符串,会把所有非字母数字的单个字符(包括连字符、@、$等)都拆成独立元素,拼接时用空格连接就会产生多余空格 - 原代码只对整个拆分后的token做字典匹配,只有当token完全等于字典键的时候才会替换,而
23beach整个token不等于beach,所以无法触发替换
最优实现方案
直接用re.sub的回调函数做匹配替换,不需要拆分拼接字符串,完全保留原有非关键词的内容结构:
import re def standarisationn(addr): # 原有逻辑:逗号替换为空格 addr = re.sub(',', ' ', addr) lookp_dict = {"allee":"ale","alley":"ale","ally":"ale","aly":"ale", "arcade":"arc", "apartment":"apt","aprtmnt":"apt","aptmnt":"apt", "av":"ave","aven":"ave","avenu":"ave","avenue":"ave","avn":"ave","avnue":"ave", "beach":"bch", "bend":"bnd", "blfs":"blf","bluf":"blf","bluff":"blf","bluffs":"blf", "boul":"blvd","boulevard":"blvd","boulv":"blvd", "bottm":"bot","bottom":"bot", "branch":"br","brnch":"br", "brdge":"brg","bridge":"brg", "bypa":"byp","bypas":"byp","bypass":"byp","byps":"byp", "camp":"cmp", "canyn":"cny","canyon":"cny","cnyn":"cny", "southwest":"sw" ,"northwest":"nw"} # 按键长度倒序排序,避免短键优先匹配覆盖长键 sorted_keys = sorted(lookp_dict.keys(), key=lambda x: -len(x)) # 构造正则:匹配前后都不是字母的关键词,支持数字、符号前缀后缀的场景 pattern = re.compile(r'(?<![a-zA-Z])({})(?![a-zA-Z])'.format('|'.join(map(re.escape, sorted_keys)))) # 替换匹配到的关键词 res = pattern.sub(lambda x: lookp_dict[x.group()], addr) # 合并多个连续空格为单个,符合输出格式要求 res = re.sub(r'\s+', ' ', res).strip() return res # 测试 print(standarisationn("well-2-34 2 @$%23beach bend com")) # 输出:well-2-34 2 @$%23bch bnd com
方案说明
- 没有拆分原字符串的非空格字符,直接在原字符串基础上做替换,连字符、特殊符号的位置和原有拼接关系完全保留,不会产生多余空格
- 正则用前后向断言限制匹配的关键词前后无其他字母,只要是独立的字母序列就可以匹配,因此
23beach中的beach可以被正确识别替换 - 对字典键按长度倒序排序,避免出现短键先匹配导致长键无法匹配的问题,比如存在
av和avenue时,会优先匹配更长的avenue
内容的提问来源于stack exchange,提问作者Cuckoo
相关产品推荐
相关产品推荐

