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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:25:17