Python określa i sprawdza, czy ciąg znaków jest numeryczny czy alfabetyczny

Biznes

Python udostępnia kilka metod łańcuchowych pozwalających określić i sprawdzić, czy typ łańcucha jest numeryczny czy alfabetyczny.

Każda metoda jest objaśniona za pomocą przykładowego kodu.

  • Określa, czy ciąg znaków jest cyfrą dziesiętną:str.isdecimal()
  • Określanie, czy ciąg znaków jest liczbą:str.isdigit()
  • Określa, czy łańcuch jest znakiem reprezentującym liczbę:str.isnumeric()
  • Określa, czy ciąg jest alfabetyczny:str.isalpha()
  • Określ, czy ciąg jest alfanumeryczny:str.isalnum()
  • Określa, czy ciągi są znakami ASCII:str.isascii()
  • Orzeczenie o pustym ciągu znaków
  • Określ, czy ciągi znaków mogą być przekształcane na liczby

W przypadku metod innych niż isascii(), łańcuch zawierający pusty łańcuch, następujące symbole itd. jest fałszywy.

  • ,
  • .
  • -

-1,23 itd., jako wartość liczbowa, jest wyjaśnione na końcu tego rozdziału.

Wyrażenia regularne mogą być używane do bardziej elastycznego określania typów znaków i wyodrębniania odpowiednich typów znaków.

Więcej informacji o tym, jak określić następujące elementy, można znaleźć w poniższym artykule

  • Jak przekonwertować ciąg liczbowy (str) na liczbę (int, float)
  • Jak określać wielkie i małe litery

Określa, czy ciąg znaków jest cyfrą dziesiętną: str.isdecimal()

W funkcji isdecimal() jest prawdą, jeśli wszystkie znaki są cyframi dziesiętnymi, czyli znakami z ogólnej kategorii Nd Unicode. Jest to również prawda dla pełnowymiarowych cyfr arabskich itd.

s = '1234567890'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 1234567890
# isdecimal: True
# isdigit: True
# isnumeric: True

s = '1234567890'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 1234567890
# isdecimal: True
# isdigit: True
# isnumeric: True

Jeśli zawiera on symbol, taki jak znak minus lub kropka, jest fałszywy. Na przykład, aby stwierdzić, że ciąg znaków taki jak „-1.23” jest wartością liczbową, można użyć obsługi wyjątków. Wyjaśniono to na końcu tej sekcji.

s = '-1.23'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = -1.23
# isdecimal: False
# isdigit: False
# isnumeric: False

Określanie, czy ciąg znaków jest liczbą: str.isdigit()

W funkcji isdigit(), oprócz liczb, które są prawdziwe w funkcji isdecimal(), prawdziwe są również liczby, których wartość właściwości Unicode Numeric_Type jest Digit lub Decimal.

Na przykład liczba z indeksem górnym reprezentująca kwadrat jest fałszywa w funkcji isdecimal(), ale prawdziwa w funkcji isdigit().

  • liczba w indeksie górnym oznaczająca kwadrat
    • ²
    • '\u00B2}'
s = '10\u00B2'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 10²
# isdecimal: False
# isdigit: True
# isnumeric: True

Określa, czy łańcuch jest znakiem reprezentującym liczbę: str.isnumeric()

W funkcji isnumeric(), oprócz liczb, które są prawdziwe w isdigit(), prawdziwe są również liczby, których wartość właściwości Unicode Numeric_Type jest Numeric.

Ułamki, cyfry rzymskie i chińskie są również prawdziwe.

s = '\u00BD'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = ½
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '\u2166'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = Ⅶ
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '一二三四五六七八九〇'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 一二三四五六七八九〇
# isdecimal: False
# isdigit: False
# isnumeric: True

s = '壱億参阡萬'
print('s =', s)
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = 壱億参阡萬
# isdecimal: False
# isdigit: False
# isnumeric: True

Określa, czy ciąg jest alfabetyczny: str.isalpha()

W funkcji isalpha() prawdziwa jest właściwość kategorii ogólnej Unicode, która ma jedną z poniższych cech.

  • Lm
  • Lt
  • Lu
  • Ll
  • Lo

Alfabet, znaki chińskie itp. będą prawdziwe.

s = 'abc'
print('s =', s)
print('isalpha:', s.isalpha())
# s = abc
# isalpha: True

s = '漢字'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 漢字
# isalpha: True

Cyfry arabskie są fałszywe, ale cyfry chińskie są prawdziwe, ponieważ są również znakami chińskimi; jednak zera w cyfrach chińskich są fałszywe.

s = '1234567890'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 1234567890
# isalpha: False

s = '1234567890'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 1234567890
# isalpha: False

s = '一二三四五六七八九'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 一二三四五六七八九
# isalpha: True

s = '壱億参阡萬'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 壱億参阡萬
# isalpha: True

s = '〇'
print('s =', s)
print('isalpha:', s.isalpha())
# s = 〇
# isalpha: False

Cyfry rzymskie są fałszywe.

s = '\u2166'
print('s =', s)
print('isalpha:', s.isalpha())
# s = Ⅶ
# isalpha: False

Określ, czy ciąg jest alfanumeryczny: str.isalnum()

W funkcji isalnum() jest prawdą, jeśli każdy znak jest prawdziwy w którejkolwiek z wymienionych dotychczas metod.

  • isdecimal()
  • isdigit()
  • isnumeric()
  • isalpha()

Każdy znak jest obliczany indywidualnie, więc łańcuch zawierający litery i cyfry będzie miał wartość true w isalnum(), nawet jeśli we wszystkich innych metodach będzie miał wartość false.

s = 'abc123'
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
# s = abc123
# isalnum: True
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False

Określa, czy ciągi są znakami ASCII: str.isascii()

W Pythonie 3.7 dodano funkcję isascii(). Zwraca ona wartość true, jeśli wszystkie znaki w łańcuchu są znakami ASCII.

Oprócz liczb i liter prawdziwe są również symbole, takie jak + i -.

s = 'abc123+-,.&'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = abc123+-,.&
# isascii: True
# isalnum: False

Hiragana i inne znaki spoza ASCII są fałszywe.

s = 'あいうえお'
print('s =', s)
print('isascii:', s.isascii())
print('isalnum:', s.isalnum())
# s = あいうえお
# isascii: False
# isalnum: True

Jak zobaczymy dalej, w przeciwieństwie do innych metod, isascii() zwraca wartość true nawet dla pustego łańcucha.

Orzeczenie o pustym ciągu znaków

Pusty łańcuch ma wartość true dla metody isascii() i false dla pozostałych metod.

s = ''
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
print('isascii:', s.isascii())
# s = 
# isalnum: False
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False
# isascii: True

Użyj funkcji bool(), aby określić, czy jest to pusty łańcuch. Wartością zwracaną jest fałsz dla pustego łańcucha i prawda w przeciwnym przypadku.

print(bool(''))
# False

print(bool('abc123'))
# True

Określ, czy ciągi znaków mogą być przekształcane na liczby

Ciągi o wartościach ujemnych lub ułamkowych zawierają kropki lub znaki minus. Dlatego wynikiem jest fałsz dla wszystkich metod z wyjątkiem isascii().

Chociaż jest prawdziwa dla funkcji isascii(), nie nadaje się do określania, czy ciąg znaków można przekonwertować na wartość liczbową, ponieważ jest prawdziwa nawet wtedy, gdy zawiera inne symbole lub znaki alfabetyczne.

s = '-1.23'
print('s =', s)
print('isalnum:', s.isalnum())
print('isalpha:', s.isalpha())
print('isdecimal:', s.isdecimal())
print('isdigit:', s.isdigit())
print('isnumeric:', s.isnumeric())
print('isascii:', s.isascii())
# s = -1.23
# isalnum: False
# isalpha: False
# isdecimal: False
# isdigit: False
# isnumeric: False
# isascii: True

Łańcuchy mogą być konwertowane na liczby zmiennoprzecinkowe za pomocą funkcji float(). Błąd dla łańcuchów, które nie mogą zostać przekonwertowane.

print(float('-1.23'))
# -1.23

print(type(float('-1.23')))
# <class 'float'>

# print(float('abc'))
# ValueError: could not convert string to float: 'abc'

Dzięki obsłudze wyjątków można zdefiniować funkcję, która zwraca wartość true, gdy ciąg znaków można przekonwertować za pomocą funkcji float().

def is_num(s):
    try:
        float(s)
    except ValueError:
        return False
    else:
        return True

print(is_num('123'))
# True

print(is_num('-1.23'))
# True

print(is_num('+1.23e10'))
# True

print(is_num('abc'))
# False

print(is_num('10,000,000'))
# False

Jeśli chcesz określić, że liczba oddzielona przecinkami jest również prawdziwa, użyj funkcji replace(), aby usunąć przecinek (zastąpić go pustym łańcuchem).

def is_num_delimiter(s):
    try:
        float(s.replace(',', ''))
    except ValueError:
        return False
    else:
        return True

print(is_num_delimiter('10,000,000'))
# True

Jeśli chcesz obsługiwać delimitację białych spacji, możesz dodatkowo użyć funkcji replace().

def is_num_delimiter2(s):
    try:
        float(s.replace(',', '').replace(' ', ''))
    except ValueError:
        return False
    else:
        return True

print(is_num_delimiter2('10,000,000'))
# True

print(is_num_delimiter2('10 000 000'))
# True
Copied title and URL