Использование re.findall при чтении CSV - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь прочитать файл CSV и получить определенную часть c, используя re.findall.

Вот пример первых нескольких строк моего файла CSV

School: Johnson County Elementary School | Student First Name: John | Student Last Name: Doe, 1, Please leave yearbook with sister in office
School: Kirkwood Elementary School | Student First Name: Karen | Student Last Name: Rodgers, 3, Null
School: 2nd Street Elementary School | Student First Name: Joe | Student Last Name: Greene, 12, Give to mom at pickup

Вот код, который я использую

import csv
import re

def fileReader():
while True:
    input_file = input('What file would you like to read from? (or stop) ')
    if input_file.upper() == 'STOP':
        break
    schools = input('What school would you like to generate reports for? ')
    file_contents = open(input_file, newline='', encoding='utf-8')
    for row in csv.reader(file_contents):
        schoolName = re.findall('(?<=Student First Name: ).+?(?= |)',row[0], re.DOTALL)
        print(schoolName)


fileReader()

И когда я запускаю этот код, на выходе появляется первый символ названия школы, подобный этому:

['J']
['K']
['2']

Вместо Мне нужно полное название школы, например:

['Johnson County Elementary School']
['Kirkwood Elementary School']
['2nd Street Elementary School']

Я действительно смущен, почему re.finall возвращает первую букву, а не все название школы.

1 Ответ

0 голосов
/ 28 февраля 2020

Сначала ищите School not Student First Name ?

Затем | является особенным для регулярных выражений в качестве оператора OR и должен быть экранирован как \|, чтобы найти его буквально:

schoolName = re.findall('(?<=School: ).+?(?= \|)',row[0], re.DOTALL)

Вам не нужен модуль csv или заглядывание вперед / назад, чтобы найти школы:

import re

with open('input.csv') as file:
    for row in file:
        schoolName = re.search('School: (.+?) \|',row).group(1)
        print(schoolName)
...