Вы можете использовать тот факт, что только блок информации, который включает в себя неоднозначные пробелы это название? Например:
a = 'Birdman 2014 4 9'
b = 'The Grand Budapest Hotel 2014 4 9'
Если мы используем split
, чтобы разбить их на слова:
>>> aa.split()
['Birdman', '2014', '4', '9']
>>> bb.split()
['The', 'Grand', 'Budapest', 'Hotel', '2014', '4', '9']
Мы получаем списки различных графов (4 и 7 соответственно). НО мы знаем, что nominations
всегда будет последним и только последним словом. Обратная индексация Python здесь очень приятная.
>>> aa = a.split()
>>> bb = b.split()
>>> aa[-1]
'9'
>>> bb[-1]
'9'
Мы можем индексировать oscars
и year
, а также:
>>> aa[-2] # oscars
'4'
>>> bb[-2] # oscars
'4'
>>> aa[-3] # year
'2014'
>>> bb[-3] # year
'2014'
Используйте функцию int()
, если вам нужно, чтобы превратить эти слова обратно в цифры. Чтобы получить заголовок, мы можем получить доступ к фрагменту списка, используя эту же обратную индексацию.
>>> aa[0:-3] # title
['Birdman']
>>> bb[0:-3] # title
['The', 'Grand', 'Budapest', 'Hotel']
Обратите внимание, что [0:-3]
просто можно записать в виде [:-3]
, 0 Значение по умолчанию для индекса запуска выражается слева от :
характера.
Списки одного или нескольких слов, вероятно, не так, как вы хотите, чтобы выразить свои названия, так, чтобы превратить их обратно в одну строку, используйте join()
метод:
>>> awords = aa[:-3]
>>> aWords = aa[:-3]
>>> bWords = bb[:-3]
>>> ' '.join(aWords)
'Birdman'
>>> ' '.join(bWords)
'The Grand Budapest Hotel'
Если вы собираетесь сделайте это много, я бы написал простой парсер, который превратил вашу единственную строку в нечто более структурированное. Давайте использовать простой объект с именованными полями:
class MovieRecord(object):
pass
(Вы можете использовать именованный кортеж, а также, или словарь, но я думаю, что классы всегда хорошо, потому что, как моя программа растет, я могу связать поведение объектные данные, которые естественным образом подходят для него, другие варианты являются более плоским более статическим подходом и, как правило, приводят к поведению, не очень инкапсулированному в вашей программе).
Теперь нам нужна функция для синтаксического анализа одной текстовой строки в MovieRecord. Принимая то, что мы установили выше:
def parseMovie(line):
newRecord = MovieRecord()
words = line.split()
newRecord.name = ' '.join(words[:-3])
newRecord.year = int(words[-3])
newRecord.oscars = int(words[-2])
newRecord.nominations = int(words[-1])
return newRecord
Тестирование, что из:
>>> sample = 'The Grand Budapest Hotel 2014 4 9'
>>> record = parseMovie(sample)
>>> record.name
'The Grand Budapest Hotel'
>>> record.year
2014
>>> record.oscars
4
>>> record.nominations
9
Не так много осталось в настоящее время. Учитывая файл этих строк, мы можем использовать тот факт, что python любит по умолчанию считывать строки файлов:
with open('yourListOfMovies', 'r') as file:
allMovies = [parseMovie(line) for line in file]
Используйте регулярное выражение. –
Вы что-то пробовали? Отправьте код, который вы использовали. – Gabriel
Возможно, вам понадобится посмотреть формат вкладок для ввода. – mattsap