2013-11-28 3 views
1

명령 콘솔 입력을 교정하고 문자열이 rgb 16 진 문자열인지 확인하려고합니다. (예 : # FAF0E6) 현재 try : except : 블록으로 작업하고 있습니다.문자열이 rgb 16 진 문자열인지 확인하는 방법

def isbgcolor(bgcolor): 
    #checks to see if bgcolor is binary 
    try: 
     float(bgcolor) 
     return True 
    except ValueError: 
     return False 

.startswith ('#')도 사용하려고했습니다. Java에서이 함수를 작성하는 방법을 본 적이 있지만 필자는 아직 초보자이며 Python 만 알고 있습니다. 도움?

+0

"바이너리"가 무슨 뜻인지 모르겠지만 올바른 플로트 표현인지 여부를 확인하는 것은 "바이너리"의 의미와 일치하지 않는 것 같아요. 확실히 당신이 원하는 것이 아닙니다. 여기 -' # FAF0E6'는 float 표현에 가깝지 않으며'1.23e6'와 같은 float 표현은 RGB 16 진수 문자열에 근접하지 않습니다. – abarnert

+0

무엇을위한 valib rgb 헥스? 예를 들어 css는 #fff를 받아 들일 것입니다 –

+0

"#"을 제거하고 그것을'int (text.replace ("#", ''), 16)로 전달해야합니다 :' –

답변

5

일반적으로 문자열이 간단한 형식과 일치하는지 확인하는 가장 좋은 방법은 실제로 구문 분석을 시도하는 것입니다. (특히 검사 만하는 경우에는 유효하다면 구문 분석을하고 그렇지 않은 경우에는 오류를 인쇄하십시오.) 그럼, 해보 죠.

표준 라이브러리는 모든 종류의 유용한 것들로 가득 차 있기 때문에 검색 할 가치가 있습니다. 16 진수 문자열을 파싱하려면 가장 먼저 오는 것은 binascii.unhexlify입니다. 우리는 첫 번째 # 문자 뒤에 모든 것을 ununlify하고 싶습니다. 그래서 :

import binascii 

def parse_bgcolor(bgcolor): 
    if not bgcolor.startswith('#'): 
     raise ValueError('A bgcolor must start with a "#"') 
    return binascii.unhexlify(bgcolor[1:]) 

def is_bgcolor(bgcolor): 
    try: 
     parse_bgcolor(bgcolor) 
    except Exception as e: 
     return False 
    else: 
     return True 

이 3 자리 16 진수 문자열을 받아 (하지만 그래서 대부분의 # -prefixed 진수 RGB를 사용하는 데이터 포맷 할), 심지어 16 문자 것들. 길이에 대한 수표를 추가하려면이를 추가 할 수 있습니다. 규칙 == 6 또는 in (3, 6) 또는 % 3 == 0입니까? 나도 몰라,하지만 당신이 추가하고 싶은 규칙이 있다면 아마 할 것입니다.

parse_bgcolor을 사용하면 0-65535의 3 가지 값을 원할 때의 값이 0-255 인 값을 얻을 수 있습니다. 수동으로 조합하거나 각 두 자리 문자 쌍을 숫자 (예 : int(pair, 16))로 파싱하거나 과 같이 이미 포함 된 6 자의 bytes을 피드 할 수 있습니다. 당신이하고 싶은 일을 정확히 알게되면 당신이해야 할 일은 꽤 쉽습니다.

마지막으로 CSS 또는 HTML을 구문 분석하려는 경우 red 또는 rgb(1, 2, 3)과 같은 항목도 유효한 색상입니다. 그걸 처리해야합니까? 그렇다면 이보다 조금 더 똑똑한 것이 필요할 것입니다. 가장 먼저 할 일은 구문 분석하려는 내용의 스펙을 살펴보고 코드로 전환하는 데 필요한 규칙을 작성하는 것입니다. 그런 다음 코드를 작성할 수 있습니다.

+0

감사합니다. 이것은 필자가 필요로하는 라인을 따른 것입니다. – user2998514

6

다음은 진수 RGB 문자열 일치합니다 다음. #로 시작하는 문자열이 전달 정확히 6 자리의 16 진수 다음에 경우

import re 

_rgbstring = re.compile(r'#[a-fA-F0-9]{6}$') 

def isrgbcolor(value): 
    return bool(_rgbstring.match(value)) 

이 만 반환 True

데모 :

>>> isrgbcolor('#FAF0E6') 
True 
>>> isrgbcolor('#FAF0') 
False 
>>> isrgbcolor('FAF0E6') 
False 
>>> isrgbcolor('#NotRgb') 
False 

3 자리 CSS 형식도 지원하려면 패턴을 업데이트하십시오.

해시에 이어 3 자리 16 진수와 선택적으로 3 자리의 추가 숫자가 일치합니다.

+2

#FFF와 같은 문자열은 CSS에서 유효한 16 진수 색상 값입니다. –

+1

@SimeonVisser : 여기에 CSS에 대한 언급이 없습니다. 대체 패턴을 추가하여 3 자리 또는 6 자리를 일치시킵니다. –

+1

@SimeonVisser : 그가 원하는 형식을 지정하는 것은 OP에 달려 있습니다. 정확히 6 자의 16 진 문자입니까? 임의의 int N에 대해 3N 16 진수 문자? CSS가 받아 들일만한 것은 무엇입니까? 후자의 경우 CSS는'red '를 색상으로 허용합니다. 우리가 그걸 처리해야합니까? – abarnert

0

가장 간단한 방법 인 것 같습니다. 이 정규식은 P이 16 진수가 아닌 것을 알 수 있습니다.

import re 
from pprint import pprint 

hex = '#f8Ed90P' 

pprint(re.findall('[^#0-9a-fA-F]', hex)) 

..so re.findall의 결과에 뭔가가있는 경우 HEX 구조에 문제가있다.

macbook-pro:Desktop allendar$ python3 test.py 
['P'] 

이 코드는 해시 데크는 물론 잘하지 않은, 어디서든 할 수있는 결함이 있습니다

이 코드는 결과.

정규식을 쉽게 식별 할 수 있도록 문자열 시작 부분의 해시 덱을 확인하고 싶을 수 있습니다. 이후에 다른 문자가 정규 표현식 검사에서 허용 된 문자를 따르는 지 확인하십시오.

관련 문제