You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则匹配格式各异的同名城市失败问题求助

问题排查与解决

你的代码问题出在正则表达式的限制太严格,原正则^(([A-Z]+[a-z]*)|([a-z]+[A-Z]*))[ -]?(([A-Z]+[a-z]*)|([a-z]+[A-Z]*))$要求城市名的每个部分只能是「连续大写+后续小写」或者「连续小写+后续大写」的模式,像nEw-yOrk这种大小写随机混合的字符串根本通不过正则匹配,直接返回False,自然没法和New York匹配。

解决思路

不需要用正则去限制大小写格式,而是直接对城市名做归一化处理,统一成相同格式后再比较:

  1. 统一转换为大写(或小写,保持一致即可)
  2. 将所有连字符(-)替换为空格,或者直接移除所有空格和连字符
  3. 去除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:15:32