Python正则匹配格式各异的同名城市失败问题求助
问题排查与解决
你的代码问题出在正则表达式的限制太严格,原正则^(([A-Z]+[a-z]*)|([a-z]+[A-Z]*))[ -]?(([A-Z]+[a-z]*)|([a-z]+[A-Z]*))$要求城市名的每个部分只能是「连续大写+后续小写」或者「连续小写+后续大写」的模式,像nEw-yOrk这种大小写随机混合的字符串根本通不过正则匹配,直接返回False,自然没法和New York匹配。
解决思路
不需要用正则去限制大小写格式,而是直接对城市名做归一化处理,统一成相同格式后再比较:
- 统一转换为大写(或小写,保持一致即可)
- 将所有连字符(
-)替换为空格,或者直接移除所有空格和连字符 - 去除Unicode重音字符,转换为纯ASCII字符
修改后的代码
import unicodedata class CompareCities: def compare(self, city1, city2): city1_normalized = self._normalize(city1) city2_normalized = self._normalize(city2) return city1_normalized == city2_normalized def _normalize(self, city): # 1. 转换为大写 city = city.upper() # 2. 将连字符替换为空格后移除所有空格,统一格式 city = city.replace("-", " ").replace(" ", "") # 3. 处理Unicode重音,转为纯ASCII字符 city = unicodedata.normalize("NFD", city)\ .encode("ascii", "ignore")\ .decode("utf-8") return city compare_cities = CompareCities() result = compare_cities.compare("New York", "nEw-yOrk") print("same city" if result else "not same city")
代码说明
- 去掉了原有的正则验证,避免错误过滤合法的大小写混合城市名
- 归一化步骤直接处理字符串:先统一大小写,再统一分隔符(让
New York和New-York都变成NEWYORK),最后处理重音字符(比如Páris和Paris也能匹配) - 测试
"New York"和"nEw-yOrk"会返回same city,"Paris"和"New York"返回not same city,完全符合需求
内容的提问来源于stack exchange,提问作者Zembla
相关产品推荐
相关产品推荐

