2016-10-15 4 views
2

나는 이것을 많이 보았 으리라 생각하지만, 나는 아직도 일반적으로 코딩하기에 아주 익숙하고 많은 것을 배워야한다는 것을 경고하고 싶었다. 나는 시간이있을 때마다 개인 프로젝트와 유튜브에서 일함으로써 자신을 가르치려고 시도해 왔습니다.re.split() 오류에 대한 설명?

긴 버전 : 분할 기능을 사용할 때 항상 오류가 발생하지만 여전히 값을 얻습니다. 본질적으로 내 기능은 "° 분"또는 "N 38 ° 43'23" "E"와 같은 각도 또는 방향을 10 진수로 취하는 것입니다. 각도를 변환하기 위해 문자열의 숫자를 찾기 위해 인덱싱을 사용하려면 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*'c 중 0 이상과 일치하므로 빈 문자열과 일치합니다. 나는 이것이 경고에 관한 것이라고 믿습니다. 난 당신이

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\"") 
012,351,641와 함께 사용하면

이 인쇄됩니다

38.6722222222 
+1

내장 함수가 수행 할 때 regex를 사용하는 것에 반대합니다. OP의 특정 split-on-degree 문제는 정규식이 필요하지 않지만 이 방식으로 전체 구문 분석을 단일 호출로 수행 할 수 있습니다. 옵션으로 간격을 두어 패턴에 넣으면 훨씬 더 강력 해집니다. –

+0

훨씬 효율적입니다. 나는 여전히 정규식에 대해 배우고 있으므로 이것을 보면서 이해할 때까지 살펴 보겠습니다. – quesadyllan