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

