我试图找出使用一些正则表达式匹配在python中匹配输出的最佳方法。这是一个示例文本。
Student ID: EDITED Sex: TRUCK <<Fall 2016: 20160822 to 2 Rpt Dup CRIJ 3310 Foundtns of Criminal Justice 3 A COMM 3315 Leadership Communication 3 B ENGL 3430 Professional Writing 4 A <<Spring 2017: 20170117 to 20170512 () >> MKTG 3303 Principles of Marketing 3 B <<Summer 2017: 20170515 to 20170809 () >> HUMA 4300 Selected Topics in Humanities 3 <<Fall 2017: 20170828 to 20171215 () >> HUMA 4317 The Modern Era 3 COMM 4314 Intercultrl Communicatn 3 (((IT REPEATS THE SAME TYPE OF TEXT BUT WITH A DIFFERENT STUDENT BELOW)))
以下是一些代码:
import re
term_match = re.findall(r'^<<.*', filename, re.M)
course_match = re.findall(r'^[A-Z]{2,7}.*', filename, re.M
print('\n'.join(term_match))
print('\n'.join(course_match))
我有一个正则表达式来匹配学生ID和课程信息,我的问题是让它们按行顺序输出。在文档上有多个学生有很多课程作业,所以只是匹配不够好。我需要匹配ID,打印以下课程作业,然后在到达该行时打印下一个ID和课程。如何实现这样的任何帮助都会很棒!
答案 0 :(得分:0)
标志re.MULTILINE
将使正则表达式跨越多行。
也就是说,你可能会更好地逐行循环并识别每个新学生ID的时间:
student_id = ''
for line in s.splitlines(False):
if not line:
continue
elif line.startswith('STUDENT'):
student_id = line[7:].strip()
else:
print(student_id, line)
另一个想法是,您可以通过将文本分成块(每个学生ID一个)来简化问题:
starts = [mo.start() for mo in re.finditer(r'^STUDENT ID(.*)$', s, re.MULTILINE)]
starts.append(len(s))
chunks = []
for begin, end in zip(starts, starts[1:]):
chunks.append(s[begin:end])
之后,隔离每个学生的课程应该更容易: - )