หลามใช้อักษรตัวแรกพิมพ์ใหญ่เท่านั้น


179

ฉันรู้ว่า. capitalize () ใช้ตัวอักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่ แต่จะเกิดอะไรขึ้นถ้าอักขระตัวแรกเป็นจำนวนเต็ม?

นี้

1bob
5sandy

สำหรับสิ่งนี้

1Bob
5Sandy

คำตอบ:


234

หากอักขระตัวแรกเป็นจำนวนเต็มจะไม่ใช้อักษรตัวแรกเป็นตัวพิมพ์ใหญ่

>>> '2s'.capitalize()
'2s'

หากคุณต้องการฟังก์ชั่นดึงตัวเลขคุณสามารถใช้'2'.isdigit()เพื่อตรวจสอบอักขระแต่ละตัวได้

>>> s = '123sa'
>>> for i, c in enumerate(s):
...     if not c.isdigit():
...         break
... 
>>> s[:i] + s[i:].capitalize()
'123Sa'

5
และนั่นคือสิ่งที่คำตอบนี้ทำค่อนข้างมาก
njzk2

16
ฉันจะใช้ถ้า c.isalpha () มากกว่าถ้าไม่ใช่ c.isdigit ()
njzk2

1
@ Jan-PhilipGehrcke นั่นคือแบบฝึกหัดสำหรับผู้อ่าน คุณสามารถเห็นได้ว่าในกรณีนั้น s ไม่เคยว่างเปล่ามันคือ '123sa' เสมอ: D
Ali Afshar

2
@ Jan-PhilipGehrcke: ในกรณีนี้next((i for i,e in enumerate(test) if not e.isdigit()), '0')แก้มันสำหรับกรณีสตริงที่ว่างเปล่า
njzk2

5
คำตอบนี้ไม่ถูกต้อง . capitalizeจะแปลงตัวอักษรอื่น ๆ ให้ต่ำลงด้วย จากเอกสารอย่างเป็นทางการ: "ส่งคืนเวอร์ชันที่เป็นหัวเรื่องของ S นั่นคือคำที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์ใหญ่และตัวอักษรที่เหลือทั้งหมดมีตัวพิมพ์เล็ก "
karantan

246

เพียงเพราะไม่มีใครพูดถึง:

>>> 'bob'.title()
'Bob'
>>> 'sandy'.title()
'Sandy'
>>> '1bob'.title()
'1Bob'
>>> '1sandy'.title()
'1Sandy'

อย่างไรก็ตามสิ่งนี้ก็จะให้

>>> '1bob sandy'.title()
'1Bob Sandy'
>>> '1JoeBob'.title()
'1Joebob'

เช่นมันไม่เพียงแค่ใช้ประโยชน์จากตัวอักษรตัวแรก แต่แล้วก็.capitalize()มีปัญหาเดียวกันอย่างน้อยก็ใน'joe Bob'.capitalize() == 'Joe bob'นั้น


38

นี่คล้ายกับคำตอบของ @ Anon ที่ทำให้ส่วนที่เหลือของสตริงเป็นเหมือนเดิมโดยไม่ต้องใช้โมดูลอีก

def sliceindex(x):
    i = 0
    for c in x:
        if c.isalpha():
            i = i + 1
            return i
        i = i + 1

def upperfirst(x):
    i = sliceindex(x)
    return x[:i].upper() + x[i:]

x = '0thisIsCamelCase'

y = upperfirst(x)

print(y)
# 0ThisIsCamelCase

ฟังก์ชั่นอาจใช้การตรวจสอบข้อผิดพลาดเพิ่มเติม (เช่นการตรวจสอบว่า x เป็นลำดับ - แต่ฉันไม่เห็นกรณีขอบเพื่อแสดงเทคนิค)

อัปเดตตามความคิดเห็น @normanius (ขอบคุณ!)

ขอบคุณ @GeoStoneMarten ที่ชี้ให้เห็นว่าฉันไม่ได้ตอบคำถาม! - แก้ไขแล้ว


2
มีประโยชน์มาก แต่ต้องการlen(x) == 0สาขา
Xan

ตั้งแต่ python 2.5 กรณีที่ว่างเปล่ายังคงสามารถจัดการได้ในหนึ่งบรรทัด: return x[0].upper() + x[1:] if len(x) > 0 else x
danio

คำตอบที่มีประโยชน์มากเพราะcapitalize& titleตัวพิมพ์เล็กทั้งตัวแรกและตัวพิมพ์ใหญ่ตัวแรกเท่านั้น
Jonas Libbrecht

5
มีประโยชน์ เพียงแค่ใช้a[:1].upper() + a[1:]สิ่งนี้จะดูแลตัวเรือนlen(X)==0มุม
normanius

1
ทำได้ดี แต่ไม่ได้ผลสำหรับกรณีนี้เพราะฟังก์ชั่นนี้ใช้ตัวพิมพ์ใหญ่ตัวแรกเท่านั้นและตัวแรกตัวอักษรไม่ใช่ข้อความ คุณต้องแยกตัวเลขและหลักก่อนใช้และเข้าร่วมผลในกรณีนี้
GeoStoneMarten

13

นี่คือหนึ่งซับที่จะพิมพ์ใหญ่ตัวอักษรตัวแรกและออกจากกรณีของตัวอักษรที่ตามมาทั้งหมด:

import re

key = 'wordsWithOtherUppercaseLetters'
key = re.sub('([a-zA-Z])', lambda x: x.groups()[0].upper(), key, 1)
print key

ซึ่งจะส่งผลให้ WordsWithOtherUppercaseLetters


4

เมื่อเห็นที่นี่ตอบโดยเฉิน Houwu เป็นไปได้ที่จะใช้แพคเกจสตริง:

import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"

1

ฉันมากับสิ่งนี้:

import re

regex = re.compile("[A-Za-z]") # find a alpha
str = "1st str"
s = regex.search(str).group() # find the first alpha
str = str.replace(s, s.upper(), 1) # replace only 1 instance
print str

1

คุณสามารถแทนที่อักษรตัวแรก ( preceded by a digit) ของแต่ละคำโดยใช้ regex:

re.sub(r'(\d\w)', lambda w: w.group().upper(), '1bob 5sandy')

output:
 1Bob 5Sandy

1

ซับหนึ่ง: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))


ฉันคิดว่าคุณหมายถึงสิ่งนี้ใช่มั้ย '' .join (sub [: 1] .upper () + sub [1:] สำหรับ sub ใน text.split (''))
Michael

การแก้ไข ขอบคุณ
@Michael
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.