python viết hoa chữ cái đầu tiên


179

Tôi biết .capitalize () viết hoa chữ cái đầu tiên của chuỗi nhưng nếu ký tự đầu tiên là số nguyên thì sao?

điều này

1bob
5sandy

đến đây

1Bob
5Sandy

Câu trả lời:


234

Nếu ký tự đầu tiên là một số nguyên, nó sẽ không viết hoa chữ cái đầu tiên.

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

Nếu bạn muốn chức năng, loại bỏ các chữ số, bạn có thể sử dụng '2'.isdigit()để kiểm tra từng ký tự.

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

5
và đó là những gì câu trả lời này làm, khá nhiều
njzk2

16
Tôi sẽ sử dụng if c .alpha () chứ không phải nếu không phải c.itorigit ()
njzk2

1
@ Jan-PhilipGehrcke đó là một bài tập cho người đọc. Bạn có thể thấy trong trường hợp đó, s không bao giờ trống, nó luôn luôn là '123sa': D
Ali Afshar

2
@ Jan-PhilipGehrcke: trong trường hợp này, next((i for i,e in enumerate(test) if not e.isdigit()), '0')giải quyết nó cho trường hợp chuỗi trống
njzk2

5
Câu trả lời này không đúng. . capitalizecũng sẽ biến đổi các ký tự khác để hạ thấp. Từ các tài liệu chính thức: "Trả về một phiên bản chuẩn của S, tức là các từ bắt đầu bằng các ký tự trường hợp tiêu đề, tất cả các ký tự được viết còn lại có chữ thường. "
karantan

246

Chỉ bởi vì không ai khác đã đề cập đến nó:

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

Tuy nhiên, điều này cũng sẽ cung cấp cho

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

tức là nó không chỉ viết hoa ký tự chữ cái đầu tiên. Nhưng sau đó .capitalize()có cùng một vấn đề, ít nhất là trong đó 'joe Bob'.capitalize() == 'Joe bob', vì vậy meh.


38

Điều này tương tự như câu trả lời của @ Anon ở chỗ nó giữ nguyên phần còn lại của chuỗi, mà không cần mô-đun re.

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

Như @Xan đã chỉ ra, hàm có thể sử dụng nhiều kiểm tra lỗi hơn (chẳng hạn như kiểm tra x là một chuỗi - tuy nhiên tôi đang bỏ qua các trường hợp cạnh để minh họa kỹ thuật)

Cập nhật mỗi bình luận @normanius (cảm ơn!)

Cảm ơn @GeoStoneMarten đã chỉ ra rằng tôi đã không trả lời câu hỏi! bắt đầu từ


2
Rất hữu ích, nhưng cần một len(x) == 0chi nhánh.
Xan

kể từ python 2.5, trường hợp trống vẫn có thể được xử lý trên một dòng: return x[0].upper() + x[1:] if len(x) > 0 else x
danio

Câu trả lời rất hữu ích, bởi vì capitalize& titleđầu tiên viết thường toàn bộ chuỗi và sau đó chỉ viết hoa chữ cái đầu tiên.
Jonas Libbrecht

5
Hữu ích. Chỉ cần sử dụng a[:1].upper() + a[1:], điều này sẽ chăm sóc các len(X)==0trường hợp góc.
Normanius 16/03/18

1
Công việc tốt nhưng không hoạt động trong trường hợp này vì chức năng này chỉ viết hoa cho caracter đầu tiên và le caracter đầu tiên là chữ số không phải là văn bản. Bạn cần chia số và chữ số trước khi sử dụng và tham gia kết quả trong trường hợp này.
GeoStoneMarten

13

Dưới đây là một lớp lót sẽ viết hoa chữ cái đầu tiên và để lại trường hợp của tất cả các chữ cái tiếp theo:

import re

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

Điều này sẽ dẫn đến WordsWithOtherUppercaseLetters


4

Như được thấy ở đây được trả lời bởi Chen Houwu, có thể sử dụng gói chuỗi:

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

1

Tôi nghĩ ra cái này:

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

Bạn có thể thay thế chữ cái đầu tiên ( preceded by a digit) của mỗi từ bằng regex:

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

output:
 1Bob 5Sandy

1

một lớp lót: ' '.join(sub[:1].upper() + sub[1:] for sub in text.split(' '))


Tôi nghĩ bạn có nghĩa là điều này không bạn? '' .join (sub [: 1] .upper () + sub [1:] cho sub trong văn bản.split (''))
Michael

Đã sửa. Cảm ơn
@Michael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.