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

如何让Python的.isalpha()方法不统计带重音的字母?

修正英文字母统计函数

我的代码如下:

def return_num_characters(s):
    count = 0
    for i in s:
        if i.isalpha():
            count+=1
    return count

这个函数会高估输入字符串中的英文字母数量——我需要只统计a-z(含大小写)的英文字母,排除空格、标点、数字及其他所有非英文字母字符。当前针对以下测试用例输出为994,但正确结果应该是974。

测试用例:

case_character_count
Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Sehet, wie die klaren Sterne
Wandeln in des Himmels [Aun]1,
Und auf uns [herniederschaun]2,
Schweigend aus der blauen Ferne.

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Schweigend naht des Lenzes Milde
Sich der Erde weichem Schooß,
Kränzt den Silberquell mit Moos,
Und mit Blumen die Gefilde.

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Wenn nicht mehr des Wetters Wogen
Um den Himmel tobend ziehn,
Donner krachen, Blitze sprühn,
Blüht des Friedens stiller Bogen.

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Wo der Wellen rauh Getümmel
Schweigt, des Meeres Brausen ruht,
In der unbewegten Fluth
Glänzt der klare, blaue Himmel.

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Nicht zu Salems hohen Thoren,
Zu der Königsstädte Pracht
Stieg die heil'ge Wundernacht,
Aus des Urlichts Quell gebohren.

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
Engelchöre sangen Lieder
In des Nachthauchs leisem Wehn,
Und auf Bethlehms stille Höhn
Schwebten Seraphim hernieder. -

Wie schön bist du,
Freundliche Stille, himmlische Ruh! -
In des Kindes zarter Hülle,
In der heil'gen Mutter Schooß,
Auf der Krippe weichem Moos
Lag des ew'gen Lichtes Fülle!

问题原因

isalpha()方法会识别所有Unicode定义的字母,包括德语的ö、ü、ä这类带变音符号的字符,而这些不在我们需要统计的a-z范围内,所以导致计数偏高。

修改方案

方案1:直接判断字符范围

把判断条件改成检查字符是否属于a-z或A-Z:

def return_num_characters(s):
    count = 0
    for i in s:
        # 只统计纯英文字母(大小写)
        if i.lower() in 'abcdefghijklmnopqrstuvwxyz':
            count += 1
    return count

方案2:使用正则表达式(更简洁)

用正则匹配所有a-zA-Z的字符,然后统计匹配结果的长度:

import re

def return_num_characters(s):
    # 匹配所有英文字母,返回匹配列表的长度
    return len(re.findall(r'[a-zA-Z]', s))

这两种方法都会过滤掉变音符号、数字、标点等非英文字母,测试用例的结果会变成正确的974。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:03:32