Python正则匹配行尾特定元素错误排查:结果超出预期
问题分析与修正
你的代码核心问题出在正则表达式的写法错误:
- 你使用的
r"[B$]"是一个字符类([]包裹的内容),它的作用是匹配单个字符——要么是字母B,要么是符号$。这就导致姓名里的B(比如Binny、Billy开头的B)都会被统计进来,再加上两个成绩的B,最终得到的数量自然远超预期的2个。 - 另外,字符类里的
$失去了正则中“行尾锚点”的特殊意义,变成了匹配$符号本身,这完全不符合你要定位成绩的需求。
修正方案
要准确匹配作为成绩的行尾B,需要满足两个核心条件:
- 这个
B在冒号(:)之后,可能带有若干空格 B位于每行的末尾
可以使用带捕获组的正则,结合多行模式实现:
import re def grades(): with open ("assets/grades.txt", "r") as file: grades = file.read() # 正则说明: # :\s* 匹配冒号+任意数量的空格(包括0个) # (B) 捕获目标字符B # $ 匹配行尾(需配合MULTILINE模式) pattern = r":\s*(B)$" # re.MULTILINE让$匹配每行的末尾,而非整个文本的末尾 result = re.findall(pattern, grades, re.MULTILINE) return result x = grades() print(x) # 输出: ['B', 'B']
补充说明
如果只是需要统计B的数量,直接用len(result)就能得到正确的数字2。
内容的提问来源于stack exchange,提问作者AhmedHusnain
相关产品推荐
相关产品推荐

