Python fastställer och kontrollerar om en sträng är numerisk eller alfabetisk.

Företag

Python tillhandahåller flera strängmetoder för att avgöra och kontrollera om en sträng är numerisk eller alfabetisk.

Varje metod förklaras med exempelkod.

  • Fastställer om en sträng är en decimalsiffra.:str.isdecimal()
  • Bestämma om en sträng är ett tal:str.isdigit()
  • Fastställer om en sträng är ett tecken som representerar ett tal.:str.isnumeric()
  • Bestämmer om strängen är alfabetisk:str.isalpha()
  • Bestämma om strängen är alfanumerisk:str.isalnum()
  • Avgör om strängar är ASCII-tecken.:str.isascii()
  • Dom över en tom sträng
  • Bestämma om strängar kan omvandlas till siffror

För andra metoder än isascii() är en sträng som innehåller en tom sträng, följande symboler osv. falsk.

  • ,
  • .
  • -

-1,23 osv., som ett numeriskt värde förklaras i slutet av detta avsnitt.

Regelbundna uttryck kan användas för att bestämma teckentyper på ett mer flexibelt sätt och för att extrahera relevanta teckentyper.

I följande artikel finns mer information om hur du fastställer följande

  • Hur konverterar man en numerisk sträng (str) till ett tal (int, float)?
  • Hur man bestämmer stora och små bokstäver

Fastställer om en sträng är en decimalsiffra.: str.isdecimal()

I isdecimal() är det sant om alla tecken är decimalsiffror, det vill säga tecken i den allmänna kategorin Nd i Unicode. Det är också sant för arabiska siffror med full bredd osv.

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

Om det innehåller en symbol, t.ex. ett minustecken eller en punkt, är det falskt. Om du till exempel vill fastställa att en sträng som ”-1,23” är ett numeriskt värde kan du använda undantagshantering. Detta förklaras i slutet av det här avsnittet.

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

Bestämma om en sträng är ett tal: str.isdigit()

I isdigit() är förutom de tal som är sanna i isdecimal() även tal vars Unicode-egenskapsvärde Numeric_Type är Digit eller Decimal sanna.

Till exempel är ett överskrivet tal som representerar en kvadrat falskt i isdecimal() men sant i isdigit().

  • ett tal i överskrift som representerar kvadraten
    • ²
    • '\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

Fastställer om en sträng är ett tecken som representerar ett tal.: str.isnumeric()

I isnumeric() är förutom de siffror som är sanna i isdigit() även siffror vars Unicode-egenskapsvärde Numeric_Type är Numeric sanna.

Bråk, romerska siffror och kinesiska siffror är också sanna.

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

Bestämmer om strängen är alfabetisk: str.isalpha()

I isalpha() är en egenskap för Unicodes allmänna kategori med något av följande sant.

  • Lm
  • Lt
  • Lu
  • Ll
  • Lo

Alfabetet, de kinesiska tecknen osv. kommer att vara sanna.

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

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

Arabiska siffror är falska, men kinesiska siffror är sanna eftersom de också är kinesiska tecken; nollor i kinesiska siffror är dock falska.

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

Romerska siffror är falska.

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

Bestämma om strängen är alfanumerisk: str.isalnum()

I isalnum() är det sant om varje tecken är sant i någon av följande metoder som listats hittills.

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

Varje tecken utvärderas individuellt, så en sträng som innehåller bokstäver och siffror blir sann i isalnum() även om den blir falsk i alla andra metoder.

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

Avgör om strängar är ASCII-tecken.: str.isascii()

Python 3.7 lade till isascii(). Den returnerar sant om alla tecken i strängen är ASCII-tecken.

Förutom siffror och bokstäver finns även symboler som + och -.

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

Icke-ASCII-hiragana och andra tecken är falska.

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

Som vi kommer att se härnäst returnerar isascii(), till skillnad från de andra metoderna, sant även för en tom sträng.

Dom över en tom sträng

En tom sträng är sann för isascii() och falsk för de andra metoderna.

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

Använd bool() för att avgöra om det är en tom sträng. Returvärdet är falskt för en tom sträng och sant i annat fall.

print(bool(''))
# False

print(bool('abc123'))
# True

Bestämma om strängar kan omvandlas till siffror

Negativa strängar eller strängar med bråkvärden innehåller punkter eller minustecken. Därför är resultatet falskt för alla metoder utom isascii().

Även om det är sant för isascii() är det inte lämpligt för att avgöra om en sträng kan omvandlas till ett numeriskt värde, eftersom det är sant även om den innehåller andra symboler eller alfabetiska tecken.

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

Strängar kan konverteras till flyttal med float(). Fel för strängar som inte kan konverteras.

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

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

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

Med undantagshantering kan en funktion definieras som returnerar sant när en sträng kan konverteras med 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

Om du vill fastställa att ett kommaseparerat tal också är sant använder du replace() för att ta bort kommat (ersätta det med en tom sträng).

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

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

Om du vill ha stöd för avgränsning av vitrymder kan du använda replace() ytterligare.

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