Python กำหนดและตรวจสอบว่าสตริงเป็นตัวเลขหรือตัวอักษร

ธุรกิจ

Python มีวิธีสตริงหลายวิธีในการตรวจสอบและตรวจสอบว่าประเภทสตริงเป็นตัวเลขหรือตัวอักษร

แต่ละวิธีจะอธิบายด้วยโค้ดตัวอย่าง

  • กำหนดว่าสตริงเป็นตัวเลขทศนิยมหรือไม่:str.isdecimal()
  • การพิจารณาว่าสตริงเป็นตัวเลขหรือไม่:str.isdigit()
  • กำหนดว่าสตริงเป็นอักขระที่แสดงถึงตัวเลขหรือไม่:str.isnumeric()
  • กำหนดว่าสตริงเป็นตัวอักษร:str.isalpha()
  • ตรวจสอบว่าสตริงเป็นตัวอักษรและตัวเลข:str.isalnum()
  • กำหนดว่าสตริงเป็นอักขระ ASCII หรือไม่:str.isascii()
  • การตัดสินสตริงว่าง
  • ตรวจสอบว่าสตริงสามารถแปลงเป็นตัวเลขได้หรือไม่

สำหรับเมธอดอื่นที่ไม่ใช่ isascii() สตริงที่มีสตริงว่าง สัญลักษณ์ต่อไปนี้ ฯลฯ เป็นเท็จ

  • ,
  • .
  • -

-1.23 เป็นต้น เนื่องจากค่าตัวเลขจะอธิบายไว้ที่ส่วนท้ายของส่วนนี้

นิพจน์ทั่วไปสามารถใช้เพื่อกำหนดประเภทอักขระได้อย่างยืดหยุ่นมากขึ้นและเพื่อแยกประเภทอักขระที่เกี่ยวข้อง

ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตรวจสอบสิ่งต่อไปนี้

  • วิธีแปลงสตริงตัวเลข (str) เป็นตัวเลข (int, float)
  • วิธีการกำหนดตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

กำหนดว่าสตริงเป็นตัวเลขทศนิยมหรือไม่:str.isdecimal()

ใน isdecimal() จะเป็นจริงหากอักขระทั้งหมดเป็นตัวเลขทศนิยม กล่าวคือ อักขระในหมวดหมู่ทั่วไป Nd ของ Unicode นอกจากนี้ยังเป็นจริงสำหรับตัวเลขอารบิกแบบเต็มความกว้าง ฯลฯ

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

หากมีสัญลักษณ์ เช่น เครื่องหมายลบหรือจุด แสดงว่าเป็นเท็จ ตัวอย่างเช่น หากคุณต้องการกำหนดว่าสตริงเช่น ‘-1.23’ เป็นค่าตัวเลข คุณสามารถใช้การจัดการข้อยกเว้นได้ นี้จะอธิบายไว้ที่ส่วนท้ายของส่วนนี้

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

การพิจารณาว่าสตริงเป็นตัวเลขหรือไม่:str.isdigit()

ใน isdigit() นอกเหนือจากตัวเลขที่เป็นจริงใน isdecimal() ตัวเลขที่มีค่าคุณสมบัติ Unicode Numeric_Type เป็น Digit หรือ Decimal ก็เป็นจริงเช่นกัน

ตัวอย่างเช่น หมายเลขตัวยกที่แสดงกำลังสองเป็นเท็จใน isdecimal() แต่เป็นจริงใน isdigit()

  • เลขยกกำลังแทนกำลังสอง
    • ²
    • \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

กำหนดว่าสตริงเป็นอักขระที่แสดงถึงตัวเลขหรือไม่:str.isnumeric()

ใน isnumeric() นอกเหนือจากตัวเลขที่เป็นจริงใน isdigit() ตัวเลขที่มีค่าคุณสมบัติ Unicode Numeric_Type เป็น Numeric ก็เป็นจริงเช่นกัน

เศษส่วน เลขโรมัน และตัวเลขจีนก็เป็นจริงเช่นกัน

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

กำหนดว่าสตริงเป็นตัวอักษร:str.isalpha()

ใน isalpha() คุณสมบัติหมวดหมู่ทั่วไปของ Unicode ที่มีข้อใดข้อหนึ่งต่อไปนี้เป็นจริง

  • Lm
  • Lt
  • Lu
  • Ll
  • Lo

ตัวอักษร อักษรจีน ฯลฯ จะเป็นจริง

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

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

ตัวเลขอารบิกเป็นเท็จ แต่ตัวเลขจีนเป็นความจริงเพราะเป็นตัวอักษรจีนด้วย อย่างไรก็ตาม ศูนย์ในตัวเลขจีนเป็นเท็จ

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

ตัวเลขโรมันเป็นเท็จ

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

ตรวจสอบว่าสตริงเป็นตัวอักษรและตัวเลข:str.isalnum()

ใน isalnum() จะเป็นจริงหากอักขระแต่ละตัวเป็นจริงในวิธีใดวิธีหนึ่งต่อไปนี้ที่แสดงไว้

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

อักขระแต่ละตัวจะถูกประเมินแยกกัน ดังนั้นสตริงที่มีตัวอักษรและตัวเลขจะเป็นจริงใน isalnum() แม้ว่าจะเป็นเท็จในวิธีอื่นๆ ทั้งหมด

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

กำหนดว่าสตริงเป็นอักขระ ASCII หรือไม่:str.isascii()

Python 3.7 เพิ่ม isascii() คืนค่า true หากอักขระทั้งหมดในสตริงเป็นอักขระ ASCII

นอกจากตัวเลขและตัวอักษรแล้ว สัญลักษณ์เช่น + และ – ก็เป็นจริงเช่นกัน

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

ฮิรางานะที่ไม่ใช่ ASCII และอักขระอื่นๆ เป็นเท็จ

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

ดังที่เราจะได้เห็นกันต่อไป ซึ่งแตกต่างจากวิธีอื่นๆ isascii() คืนค่า true แม้กระทั่งสำหรับสตริงว่าง

การตัดสินสตริงว่าง

สตริงว่างเป็นจริงสำหรับ isascii() และเท็จสำหรับวิธีอื่นๆ

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

ใช้ bool() เพื่อตรวจสอบว่าเป็นสตริงว่างหรือไม่ ค่าที่ส่งกลับเป็นเท็จสำหรับสตริงว่างและค่าจริงเป็นอย่างอื่น

print(bool(''))
# False

print(bool('abc123'))
# True

ตรวจสอบว่าสตริงสามารถแปลงเป็นตัวเลขได้หรือไม่

สตริงค่าลบหรือเศษส่วนมีจุดหรือเครื่องหมายลบ ดังนั้น ผลลัพธ์จะเป็นเท็จสำหรับวิธีการทั้งหมด ยกเว้น isascii()

แม้ว่าค่าจริงจะเป็นจริงสำหรับ isascii() แต่ก็ไม่เหมาะสำหรับการพิจารณาว่าสตริงสามารถแปลงเป็นค่าตัวเลขได้หรือไม่ เนื่องจากค่านี้เป็นจริงแม้ว่าจะมีสัญลักษณ์หรือตัวอักษรอื่นๆ

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

สตริงสามารถแปลงเป็นตัวเลขทศนิยมด้วย float() ข้อผิดพลาดสำหรับสตริงที่ไม่สามารถแปลงได้

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

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

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

ด้วยการจัดการข้อยกเว้น สามารถกำหนดฟังก์ชันที่คืนค่า จริง เมื่อสตริงสามารถแปลงด้วย 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

หากคุณต้องการตรวจสอบว่าตัวเลขที่คั่นด้วยเครื่องหมายจุลภาคเป็นจริงด้วย ให้ใช้ replace() เพื่อลบเครื่องหมายจุลภาค (แทนที่ด้วยสตริงว่าง)

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

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

หากคุณต้องการสนับสนุนการเว้นวรรค คุณสามารถใช้แทนที่ () เพิ่มเติม

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