Próbuję stworzyć sposób na wzmocnienie wejścia konsoli poleceń i sprawdzić, czy ciąg jest ciągiem sześciokątnym RGB. (Ex: # FAF0e6) Obecnie pracuję z próbie: z wyjątkiem: bloku.

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

Próbowałem również za pomocą .Stwith ('#'). Widziałem przykłady jak napisać tę funkcję w Javie, ale wciąż jestem początkującym, a python jest wszystkim, co wiem. Wsparcie?

2
user2998514 29 listopad 2013, 02:17

3 odpowiedzi

Najlepsza odpowiedź

Normalnie, najlepszym sposobem, aby sprawdzić, czy ciąg pasuje do niektórych prostych formatu, aby faktycznie spróbować go przeanalizować. (Zwłaszcza jeśli tylko sprawdzasz, dzięki czemu możesz przeanalizować, jeśli jest ważny, lub wydrukuj błąd, jeśli nie.) Więc zróbmy to.

Standardowa biblioteka jest pełna wszystkich rodzajów przydatnych rzeczy, więc zawsze warto wyszukać. Jeśli chcesz przeanalizować sznurek, pierwszą rzeczą, która pojawia się, jest {" {X0}}. Chcemy usunąć wszystko po pierwszej postaci {x1}}. Więc:

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

Akceptuje to 3-znakowe struny sześciokątne (ale wtedy więc zrób większość formatów danych, które używają # - prefiksowany HEX RGB), a nawet 16-znakowych. Jeśli chcesz dodać czek, możesz to dodać. Czy reguła == 6 lub in (3, 6) lub {x3}}? Nie wiem, ale prawdopodobnie robisz, jeśli masz regułę, którą chcesz dodać.

Jeśli zaczniesz używać parse_bgcolor, odkryjesz, że daje Ci bytes z 6 wartości od 0-255, kiedy naprawdę chciałeś 3 wartości od 0-65535. Możesz je połączyć ręcznie, lub można przeanalizować każdą dwustanową parę jako numer (np. Za pomocą int(pair, 16)), lub możesz podawać 6-char bytes już masz do, powiedzmy, { {X4}}. Cokolwiek musisz zrobić, jest dość łatwo, gdy wiesz dokładnie, co chcesz zrobić.

Wreszcie, jeśli próbujesz analizować CSS lub HTML, takie jak red lub rgb(1, 2, 3) są również poprawnymi kolorami. Czy musisz poradzić sobie z tymi? Jeśli tak, potrzebujesz czegoś bardziej mądrzejszego niż to. Pierwszą rzeczą do zrobienia jest spojrzenie na specyfikację do tego, co próbujesz analizować, i wypracować reguły, które musisz zamienić w kodzie. Następnie możesz napisać kod.

6
abarnert 28 listopad 2013, 22:35

Poniżej pasują do sznurka Hex RGB:

import re

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

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

To zwraca tylko True Jeśli ciąg rozpoczynający się od #, a następnie dokładnie 6 cyfr heksowych jest przekazywany.

Próbny:

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

Jeśli chcesz również obsługiwać 3-cyfrowy format CSS, zaktualizuj wzór:

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

Dopasowuje to Hash, a następnie 3 cyfry hex, a także opcjonalne 3 dodatkowe cyfry.

6
Martijn Pieters 28 listopad 2013, 22:30

Wydaje się, że jest to najbardziej najprostszy sposób. Ten regex zauważą P nie należy do hex.

import re
from pprint import pprint

hex = '#f8Ed90P'

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

.. jeśli jest coś w wyniku re.findall jest coś nie tak z twoją strukturą sześciokątną.

Ten kod spowodował:

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

Kod ten ma wadę, że Hash-Deck może być wszędzie, co oczywiście nie ma racji.

Możesz po prostu sprawdzić pokład Hash na początku ciągu, więc Regex jest łatwiejsze do rozpoznania. Następnie sprawdź tylko, czy pozostałe znaki są zgodne z postaciami dozwolonymi w sprawdzeniu regexa.

0
28 listopad 2013, 22:37