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

如何使用正则表达式从成绩字符串提取姓名、科目与成绩至不同列表?

问题与解决方案

需求

从给定的考生信息字符串中提取:

  • 考生姓名(JOHN DOE JAMES)
  • 所有科目及对应成绩,分别存入不同列表

问题现象

现有正则表达式无法正确提取,存在两个问题:

  1. 多单词科目仅返回最后一个词(如DATA PROCESSING只提取到PROCESSING)
  2. 遗漏了AGRICULTURAL SCIENCE科目及其成绩OUTSTANDING

给定的考生信息字符串

result = '''Check here to visit our corporate website
Results
Candidate Information
Examination Number
986542346
Candidate Name
JOHN DOE JAMES
Examination
MFFG FOR SCHOOL CANDIDATES 2021
Centre
LORDYARD
Subject Grades
DATA PROCESSING
B3
ECONOMICS
B3
CIVIC EDUCATION
B3
ENGLISH LANGUAGE
A1
MATHEMATICS
B3
AGRICULTURAL SCIENCE
OUTSTANDING
BIOLOGY
A1
CHEMISTRY
B2
PHYSICS
C5
C Information
Card Use
1 of 5'''

尝试的错误代码

import re

pattern = re.compile(r'[A-Z]+\n{1}[A-Z][0-9]')
searches = pattern.findall(result)
if searches:
    print(searches)
searches = pattern.findall(result)
for search in searches:
    print(search)

错误输出

第一个print语句输出:

['PROCESSING\nB3', 'ECONOMICS\nB3', 'EDUCATION\nB3', 'LANGUAGE\nA1', 'MATHEMATICS\nB3', 'BIOLOGY\nA1', 'CHEMISTRY\nB2', 'PHYSICS\nC5']

第二个print语句输出:

PROCESSING
B3
ECONOMICS
B3
EDUCATION
B3
LANGUAGE
A1
MATHEMATICS
B3
BIOLOGY
A1
CHEMISTRY
B2
PHYSICS
C5

问题分析

原正则[A-Z]+\n{1}[A-Z][0-9]存在两个缺陷:

  1. [A-Z]+只能匹配单个大写单词,无法识别带空格的多单词科目
  2. [A-Z][0-9]仅匹配字母+数字组合的成绩,无法匹配纯大写单词形式的成绩(如OUTSTANDING)

正确解决方案

完整代码

import re

result = '''Check here to visit our corporate website
Results
Candidate Information
Examination Number
986542346
Candidate Name
JOHN DOE JAMES
Examination
MFFG FOR SCHOOL CANDIDATES 2021
Centre
LORDYARD
Subject Grades
DATA PROCESSING
B3
ECONOMICS
B3
CIVIC EDUCATION
B3
ENGLISH LANGUAGE
A1
MATHEMATICS
B3
AGRICULTURAL SCIENCE
OUTSTANDING
BIOLOGY
A1
CHEMISTRY
B2
PHYSICS
C5
C Information
Card Use
1 of 5'''

# 提取考生姓名
name_match = re.search(r'Candidate Name\n([A-Z ]+)', result)
candidate_name = name_match.group(1).strip() if name_match else None

# 提取科目成绩区域:限定在Subject Grades到C Information之间
subject_section = re.search(r'Subject Grades\n(.*?)\nC Information', result, re.DOTALL).group(1)
# 匹配所有科目(多单词)和对应的成绩(字母数字/纯大写单词)
subject_grade_pairs = re.findall(r'([A-Z ]+)\n([A-Z0-9]+)', subject_section)

# 拆分科目和成绩到独立列表
subjects = [pair[0].strip() for pair in subject_grade_pairs]
grades = [pair[1].strip() for pair in subject_grade_pairs]

# 输出结果
print("考生姓名:", candidate_name)
print("科目列表:", subjects)
print("成绩列表:", grades)

代码说明

  1. 提取姓名:用Candidate Name\n([A-Z ]+)精准匹配姓名行,[A-Z ]+支持带空格的全名
  2. 限定科目区域:用re.DOTALL让.匹配换行,提取Subject Grades到C Information之间的内容,避免无关干扰
  3. 匹配科目成绩对:([A-Z ]+)\n([A-Z0-9]+)匹配多单词科目和任意形式的成绩(字母数字组合或纯大写单词)

运行结果

考生姓名: JOHN DOE JAMES
科目列表: ['DATA PROCESSING', 'ECONOMICS', 'CIVIC EDUCATION', 'ENGLISH LANGUAGE', 'MATHEMATICS', 'AGRICULTURAL SCIENCE', 'BIOLOGY', 'CHEMISTRY', 'PHYSICS']
成绩列表: ['B3', 'B3', 'B3', 'A1', 'B3', 'OUTSTANDING', 'A1', 'B2', 'C5']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:35:15