逐行输出Python Regex

时间:2017-07-23 00:08:03

标签: python regex printing output multiline

我试图找出使用一些正则表达式匹配在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和课程。如何实现这样的任何帮助都会很棒!

1 个答案:

答案 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])

之后,隔离每个学生的课程应该更容易: - )