Python bestemmer og kontrollerer, om en streng er numerisk eller alfabetisk

Forretning

Python indeholder flere strengmetoder til at bestemme og kontrollere, om en strengtype er numerisk eller alfabetisk.

Hver metode er forklaret med kodeeksempler.

  • Bestemmer, om en streng er et decimaltal:str.isdecimal()
  • Afgørelse af, om en streng er et tal:str.isdigit()
  • Bestemmer, om en streng er et tegn, der repræsenterer et tal:str.isnumeric()
  • Bestemmer, om en streng er alfabetisk:str.isalpha()
  • Bestem, om strengen er alfanumerisk:str.isalnum()
  • Bestemmer, om strenge er ASCII-tegn:str.isascii()
  • Bedømmelse af en tom streng
  • Afgøre, om strenge kan konverteres til tal

For andre metoder end isascii() er en streng, der indeholder en tom streng, følgende symboler osv., falsk.

  • ,
  • .
  • -

-1,23 osv., som en numerisk værdi, forklares i slutningen af dette afsnit.

Regelmæssige udtryk kan bruges til at bestemme tegentyper mere fleksibelt og til at udtrække de relevante tegentyper.

Se følgende artikel for at få flere oplysninger om, hvordan du kan bestemme følgende

  • Sådan konverteres en numerisk streng (str) til et tal (int, float)
  • Hvordan man bestemmer store og små bogstaver

Bestemmer, om en streng er et decimaltal: str.isdecimal()

I isdecimal() er det sandt, hvis alle tegn er decimale cifre, dvs. tegn i den generelle kategori Nd i Unicode. Det er også sandt for arabiske tal i fuld bredde 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

Hvis det indeholder et symbol som f.eks. et minustegn eller et punktum, er det falsk. Hvis du f.eks. ønsker at bestemme, at en streng som “-1,23” er en numerisk værdi, kan du bruge undtagelsesbehandling. Dette forklares i slutningen af dette afsnit.

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

Afgørelse af, om en streng er et tal: str.isdigit()

I isdigit() er ud over de tal, der er sande i isdecimal(), også tal, hvis Unicode-egenskabsværdi Numeric_Type er Digit eller Decimal, sande.

F.eks. er et tal med overskrift, der repræsenterer et kvadrat, falsk i isdecimal(), men sandt i isdigit().

  • tal i overstregning, der repræsenterer kvadratet
    • ²
    • '\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

Bestemmer, om en streng er et tegn, der repræsenterer et tal: str.isnumeric()

I isnumeric() er ud over de tal, der er sande i isdigit(), også tal, hvis Unicode-egenskabsværdi Numeric_Type er Numeric, sande.

Brøker, romertal og kinesiske tal er også rigtige.

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

Bestemmer, om en streng er alfabetisk: str.isalpha()

I isalpha() er en egenskab for en generel Unicode-kategori med en af følgende egenskaber sand.

  • Lm
  • Lt
  • Lu
  • Ll
  • Lo

Alfabetet, de kinesiske tegn osv. vil være sandt.

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

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

Arabiske tal er falske, men kinesiske tal er sande, fordi de også er kinesiske tegn; nuller i kinesiske tal er imidlertid falske.

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

Romertal er falske.

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

Bestem, om strengen er alfanumerisk: str.isalnum()

I isalnum() er det sandt, hvis hvert tegn er sandt i en af de følgende metoder, der er anført indtil nu.

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

Hvert tegn evalueres individuelt, så en streng, der indeholder bogstaver og tal, vil være sand i isalnum(), selv om den er falsk i alle andre 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

Bestemmer, om strenge er ASCII-tegn: str.isascii()

Python 3.7 tilføjede isascii(). Den returnerer sandt, hvis alle tegn i strengen er ASCII-tegn.

Ud over tal og bogstaver er symboler som + og – også gyldige.

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

Ikke-ASCII hiragana og andre tegn er falske.

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

Som vi vil se næste gang, returnerer isascii(), i modsætning til de andre metoder, sandt selv for en tom streng.

Bedømmelse af en tom streng

En tom streng er sand for isascii() og falsk for de andre metoder.

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

Brug bool() til at bestemme, om det er en tom streng. Returværdien er false for en tom streng og true ellers.

print(bool(''))
# False

print(bool('abc123'))
# True

Afgøre, om strenge kan konverteres til tal

Negative eller brøkdelstrenge indeholder punkter eller minustegn. Derfor er resultatet falsk for alle metoder undtagen isascii().

Selv om den er sand for isascii(), er den ikke egnet til at bestemme, om en streng kan konverteres til en numerisk værdi, da den er sand, selv om den indeholder andre symboler eller alfabetiske tegn.

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

Strings kan konverteres til flydende tal med float(). Fejl for strings, der ikke kan konverteres.

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 undtagelseshåndtering kan der defineres en funktion, der returnerer sandt, når en streng kan konverteres 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

Hvis du vil bestemme, at et tal adskilt af kommaer også er sandt, skal du bruge replace() til at fjerne kommaet (erstatte det med en tom streng).

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

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

Hvis du ønsker at understøtte afgrænsning af mellemrum, kan du bruge replace() yderligere.

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