2015-11-20 5 views
-1

У меня есть код ниже, который ищет шаблон и присваивает шаблон переменной num, если шаблон существует.python regex prevent nonetype error

for row1 in cursor1: 
    try: 
     m = re.search(r"^[0-9]+(?=\s)", row1[0]) 
     num = m.group() 
    except Exception as e: 
     pass 

я затем использовать переменную num в коде ниже:

z1=(item for item in numlist if item[6]==num and harversine.myhaversine(custx,custy,item[2],item[3])<150) 

Я хотел бы, чтобы исключить переменную Num и сравнить текст, который соответствует регулярное выражение непосредственно item[6] как в if item[6]==re.search(r"^[0-9]+(?=\s)",row1[0]).group() Но это, конечно, даст мне ошибку для строк, у которых нет шаблона. Как достичь того, что я пытаюсь сделать, не получив ошибку nonetype has no attribute group()? PS: Общий код, который здесь не показан, пересекает строки, создает кортежи и присваивает необходимые значения на основе выполнения инструкции if. Я хочу изменить часть соответствия регулярному выражению, показанную в коде, для лучшей производительности, потому что не все строки используют переменную num. Я хочу, чтобы регулярное выражение запускалось только для строк, которые используют эту переменную.

+0

Поместите задание 'item [6]' внутри блока 'try' и понимание внутри вашего блока' else' для вышеупомянутой попытки –

+1

"* NoneType * не имеет группы атрибутов" - я уверен, что вы знаете, как проверить на 'None' ... –

+0

@R Nar, к сожалению, я не могу пройти этот маршрут, потому что элемент [6] генерируется внутри понимания, и я использую генераторы, поэтому мне нужно, чтобы он был там, где он находится. – ketar

ответ

0

Как Кароль Хорват отметил, вы можете использовать тот факт, что текст, который не соответствует возвращает None объект

In [2]: m = re.search(r"^[0-9]+(?=\s)", row1[0]) 
Out [2]: None 

Вы можете использовать это, если условие

z1=(item for item in numlist if (re.search(r"^[0-9]+(?=\s)",row1[0]) and item[6]==re.search(r"^[0-9]+(?=\s)",row1[0]).group()) and harversine.myhaversine(custx,custy,item[2],item[3])<150) 

возвращение значение re.search(r"^[0-9]+(?=\s)",row1[0]) т. е. None будет оценивать значение false, чтобы значение всего условия было ложным.

+0

Хорошее обходное решение. Благодарю. – ketar

+0

Удовольствие от того, что это сработало для вас. Мне понравился бит, в котором вы исправили опечатку в моем редактировании –