2016-10-15 4 views
2

Я уверен, что вы видите это много, но просто хотели предупредить вас, что я все еще очень новичок в кодировании в целом и многому научился. Я пытаюсь научить себя, работая над личным проектом и youtube всякий раз, когда у меня есть время.Пояснение для ошибки re.split()?

Длинная версия: я всегда получаю сообщение об ошибке при использовании функции split, но я все равно получаю значение. По сути, что моя функция должна делать, это взять угол или подшипник, который находится в градусах ° мин. Секунд "или, например," N 38 ° 43'23 \ "E" до десятичного числа. Я использовал подшипники менее 90 градусов, чтобы использовать индексирование, чтобы найти числа в строке для преобразования угла. Однако, если бы угол не был несущим, я не мог придумать, как определить, сколько десятков мест выровняет градусы, поэтому я попытался разбить его на символ степени. Однако, когда он делает это, он возвращает ошибку, говорящую, что split() требует непустого соответствия шаблону. Что это значит? Код все еще работает, но всегда возвращает эту ошибку.

Краткая версия: Вот мой код:

def decimal(x): # converts degrees-minutes-seconds to decimal 
    dms = list(x) 
    if dms[0] == 'N' or dms[0] == 'S': 
     degrees = ((int(dms[2]) * 10) + int(dms[3])) 
     minutes = ((int(dms[-8]) * 10) + int(dms[-7]))/60 
     seconds = ((int(dms[-5]) * 10) + int(dms[-4]))/3600 
    else: 
     placeholder = re.split(r'\u00b0*', x) 
     degrees = int(placeholder[0]) 
     minutes = ((int(dms[-6]) * 10) + int(dms[-5]))/60 
     seconds = ((int(dms[-3]) * 10) + int(dms[-2]))/3600 
    return degrees + minutes + seconds  

Когда я бегу, я получаю десятичное число, но я также получаю:

FutureWarning: split() requires a non-empty pattern match. 
    return _compile(pattern, flags).split(string, maxsplit) 

Я посмотрел на другие вопросы, вывешенные о эта ошибка, но не было ответов, которые объясняли, что делать, чтобы избежать этого, или то, что на самом деле означает ошибка. Спасибо за любую помощь. Также любые советы или исправления, которые вы видите, будут очень благодарны!

ответ

2

То, что у вас есть, не является ошибкой, это предупреждение.

Для одного, я думаю, вы не должны использовать необработанную строку, вам нужен '\u00b0', символ. И 'c*' будет соответствовать 0 или более c, поэтому он соответствует пустой строке. Я считаю, что это то, о чем предупреждает. Я полагаю, что вы используете

re.split('\u00b0', x) 

Или еще лучше, просто

x.split('\u00b0') 
+0

Благодарим вас за этот совет, все проверено! – quesadyllan

+0

@quesadyllan Я рад, что это так, спасибо за обратную связь :) –

1

Поскольку вы используете регулярные выражения, можно разобрать всю строку с одним регулярным выражением, и воспользоваться группировкой:

import re 

def decimal_alt(x): 
    REGEX = re.compile(u"([NS])\\s(\\d+)\u00B0(\\d+)\'(\\d+)\"") 
    rm = REGEX.match(x) 
    if rm is not None: 
    sign = -1 if rm.group(1) == 'S' else +1 
    d = float(rm.group(2)) 
    m = float(rm.group(3))/60.0 
    s = float(rm.group(4))/3600.0 
    return sign * (d + m + s) 

при использовании

print decimal_alt(u"N 38\u00B040'20\"") 

Отпечатки

38.6722222222 
+1

Я вообще не рекомендую использовать регулярное выражение, когда встроенные функции будут делать, а конкретная проблема разделения по отдельности для OP не нуждается в регулярном выражении, но вы правильно, что таким образом весь синтаксический анализ может быть выполнен с помощью одного вызова. Если вы добавите несколько опций, расположенных в шаблоне, это также будет намного более надежным. –

+0

Это выглядит намного эффективнее. Я все еще изучаю регулярные выражения, поэтому я буду смотреть на это и поиграть с ним, пока это не будет иметь смысла. – quesadyllan

Смежные вопросы