Python Re apply / search TypeError: объект 'NoneType' не может быть подписан - PullRequest
1 голос
/ 16 апреля 2020

Может кто-нибудь объяснить, почему я получаю эту ошибку и как ее исправить? Я пытаюсь найти название года 98-99 и хочу получить первую часть (98):

пример заголовка: CAR EB C 98-99

TypeError: 'NoneType' object is not subscriptable

в строке year_min - место, где происходит ошибка.

import pandas as pd
import re

fileinString = 'a.csv'

df1 = pd.read_csv(fileinString, sep=",")

# split title of df1 into string and year tag min and year tag max
regular_expression = re.compile(r'\d\d-\d\d')

title_string = df1['*Title']


year_min = title_string.apply(lambda x: regular_expression.search(x)[0].split('-')[0])

year_max = df1['*Title'].apply(lambda x: regular_expression.search(x)[0].split('-')[1])

print(year_min)

Закрыть Пример запуска, но он не работает: https://ideone.com/JANVt2

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Это связано с тем, что у вашего df1 ['* Title'] есть значение, которое не соответствует этому шаблону

Когда он находит шаблон в строке, что-то повторяет

In [18]: regular_expression = re.compile(r'\d\d-\d\d')

In [19]: regular_expression.search('12-18')

Out[19]: <_sre.SRE_Match object; span=(0, 5), match='12-18'>

Где, когда не находит, он возвращает None

In [20]: regular_expression.search('1218') ==None
Out[20]: True

, а None не является подписным, т. Е. Вы не можете сделать None [0]

, так что в конце концов, что вы фактически делаете

1012 *
1 голос
/ 16 апреля 2020

Исключение, которое вы получаете, типично для попытки использовать скобочную запись для доступа к данным из переменной, содержащей None.

x = None
x[0]
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

Я бы сказал, что одно из ваших текстовых значений в строках заголовка не содержит шаблон, который вы ищете - для которого регулярная_экспрессия.search (x) возвращает значение «Нет».

Один из способов go обработки этих случаев - добавить несколько логик c к функции, к которой вы применяете колонка. Что-то вроде:

def extract_pattern(txt):
   match = regular_expression.search(txt)
   if match is None:
      return 'NOT FOUND'
   return match.groups(0).split('-')[0]
year_min = title_string.apply(extract_pattern)
...