如何使用正则表达式从成绩字符串提取姓名、科目与成绩至不同列表?
问题与解决方案
需求
从给定的考生信息字符串中提取:
- 考生姓名(JOHN DOE JAMES)
- 所有科目及对应成绩,分别存入不同列表
问题现象
现有正则表达式无法正确提取,存在两个问题:
- 多单词科目仅返回最后一个词(如
DATA PROCESSING只提取到PROCESSING) - 遗漏了
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]存在两个缺陷:
[A-Z]+只能匹配单个大写单词,无法识别带空格的多单词科目[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)
代码说明
- 提取姓名:用
Candidate Name\n([A-Z ]+)精准匹配姓名行,[A-Z ]+支持带空格的全名 - 限定科目区域:用
re.DOTALL让.匹配换行,提取Subject Grades到C Information之间的内容,避免无关干扰 - 匹配科目成绩对:
([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
相关产品推荐
相关产品推荐

