如何用Python正则表达式从列表筛选4-5个字母的国家名称
问题分析与解决方案
你的代码存在几个关键错误,导致返回空列表:
- 错误的匹配对象:你把整个
names列表转成字符串来匹配,而不是逐个检查每个国家名称,完全偏离了筛选单个元素的目标。 - 正则表达式不符合需求:
[A-Z]{4,6},只匹配大写字母组成的4-6字符片段且末尾带逗号,既没考虑国家名的大小写混合、带重音的字母,也没验证整个名称的长度,更和你要的4/5个字母的要求不符。 - 错误的匹配方法:
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
相关产品推荐
相关产品推荐

