Python从字符串仅提取字符:re.findall结果与预期相反问题
正则字符提取结果反向问题修复
原代码的匹配逻辑存在方向颠倒的核心问题:
- 原正则规则
[^a-zA-Z]*中,[^]的含义是匹配不在方括号划定范围内的字符,也就是会捞取所有非大小写英文字母的内容 - 搭配
*量词时,会把连续的非字母片段全部匹配出来,再通过join拼接成字符串,自然就把原本想过滤掉的逗号、冒号,以及原本想保留的空格全部提取了出来,反而把所有英文字母全部丢弃,最终输出和预期完全相反。
核心踩坑点:写带取反逻辑的正则时,一定要把本来想保留的特殊字符(这里是单词间的空格)也纳入排除范围,不然会把不想丢弃的内容一并匹配走。
要拿到预期的输出(即保留所有英文字母、保留单词间的空格,仅删除逗号、冒号这类标点,最终得到去掉标点的回文文本,对应中文语义为“一个人 一个计划 一条运河 巴拿马”),可直接按照需求调整规则,有两种通用修正写法:
- 调整
findall的匹配范围,直接把需要保留的字符纳入匹配规则,匹配大小写英文字母+空格的内容片段再拼接:import re s = "A man, a plan, a canal: Panama" newS = ''.join(re.findall("[a-zA-Z ]*", s)) print(newS) - 更符合直觉的写法是用正则替换,把所有不属于“大小写英文字母、空格”的字符全部替换为空,不需要手动拼接匹配结果:
newS = re.sub("[^a-zA-Z ]", "", s)
两种写法运行后,程序输出的英文字符串即为预期的A man a plan a canal Panama,与需求一致。
内容的提问来源于stack exchange,提问作者user4628567
相关产品推荐
相关产品推荐

