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

如何用Python正则表达式从列表筛选4-5个字母的国家名称

问题分析与解决方案

你的代码存在几个关键错误,导致返回空列表:

  1. 错误的匹配对象:你把整个names列表转成字符串来匹配,而不是逐个检查每个国家名称,完全偏离了筛选单个元素的目标。
  2. 正则表达式不符合需求:[A-Z]{4,6},只匹配大写字母组成的4-6字符片段且末尾带逗号,既没考虑国家名的大小写混合、带重音的字母,也没验证整个名称的长度,更和你要的4/5个字母的要求不符。
  3. 错误的匹配方法:re.findall是用来提取所有匹配的片段,而你需要验证整个字符串是否完全符合条件,应该用re.fullmatch。

正确代码

要筛选名称为4或5个字母的国家(包含带重音的Unicode字母,同时排除含空格、括号等非字母字符的名称),可以这样写:

import re

names = ['Azerbaijan', 'Zimbabwe', 'Cuba', 'Cambodia', 'Somalia','Mali', 'Belarus', "Côte d'Ivoire", 'Venezuela', 'Syria', 'Kazakhstan', 'Austria', 'Malawi', 'Romania', 'Congo (Brazzaville)']

# 使用re.fullmatch验证整个名称是否为4-5个Unicode字母
filtered_countries = [country for country in names if re.fullmatch(r'^\p{L}{4,5}$', country, flags=re.UNICODE)]

print(filtered_countries)

代码说明

  • ^\p{L}{4,5}$:正则表达式的含义是:
    • ^ 和 $ 分别匹配字符串的开头和结尾,确保整个名称都被检查,不会匹配名称中的片段
    • \p{L} 匹配任意Unicode字母(包括带重音的字母,比如ô)
    • {4,5} 指定长度为4或5个字符
  • re.fullmatch:确保整个字符串完全符合正则表达式的规则,不会出现部分匹配的情况
  • flags=re.UNICODE:启用Unicode字符匹配,让\p{L}生效(Python 3.6+ 可省略,默认已支持)

运行后输出结果:

['Cuba', 'Mali', 'Syria']

内容的提问来源于stack exchange,提问作者tucomax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:35:17