如何用Python的re模块筛选双词首字母相同的复合名称列表?
筛选符合规则的城市名称列表
需求
给定以下城市名称列表:
names = ['Nizhniy Novgorod', 'Cần Thơ', 'Ba Beja', 'Bandar Bampung', 'Benin City', 'Ciudad Nezahualcóyotl', 'Biên Hòa', 'São Gonçalo', 'São Luís', 'New Orleans', 'Thủ Đức']
要求仅使用Python的re模块,筛选出符合规则的名称,最终输出为['Ba Beja', 'Bandar Bampung']。
错误代码问题
用户尝试的代码返回了所有名称,完全不符合要求:
import re lst = [] for word in names: if re.findall(r'[A-Z]\w+\b', word[0]) == re.findall(r'\b[A-Z]\w+', word[1]): lst.append(word) print(lst)
输出:
['Nizhniy Novgorod', 'Cần Thơ', 'Ba Beja', 'Bandar Bampung', 'Benin City', 'Ciudad Nezahualcóyotl', 'Biên Hòa', 'São Gonçalo', 'São Luís', 'New Orleans', 'Thủ Đức']
问题出在逻辑完全错误:word[0]和word[1]取的是每个名称的第一、第二个字符,用正则匹配单个字符的结果做比较,完全偏离了筛选规则。
正确实现
首先明确规则:名称由恰好两个单词组成,且两个单词的首字母为同一个大写字母。
用re.fullmatch实现精准匹配:
import re names = ['Nizhniy Novgorod', 'Cần Thơ', 'Ba Beja', 'Bandar Bampung', 'Benin City', 'Ciudad Nezahualcóyotl', 'Biên Hòa', 'São Gonçalo', 'São Luís', 'New Orleans', 'Thủ Đức'] filtered_names = [] for name in names: # 正则匹配:首字母大写的单词 + 空格 + 同首字母的大写开头单词,覆盖整个字符串 if re.fullmatch(r'([A-Z])\w+ \1\w+', name, re.UNICODE): filtered_names.append(name) print(filtered_names)
输出结果:
['Ba Beja', 'Bandar Bampung']
代码说明
re.fullmatch:确保整个字符串完全符合正则规则,避免部分匹配的情况。([A-Z]):捕获第一个单词的大写首字母,存入分组1。\w+:匹配单词的剩余字符,re.UNICODE参数让\w支持带重音的Unicode字母(比如名称中的Cần、Biên等)。\1:引用分组1捕获的首字母,保证第二个单词的首字母和第一个完全一致。
内容的提问来源于stack exchange,提问作者tucomax
相关产品推荐
相关产品推荐

