Câu trả lời:
Các .title()
phương pháp của một chuỗi (hoặc ASCII hoặc Unicode là tốt) thực hiện điều này:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
Tuy nhiên, xem ra các chuỗi có dấu nháy đơn, như đã lưu ý trong tài liệu.
Thuật toán sử dụng một định nghĩa độc lập với ngôn ngữ đơn giản của một từ là các nhóm chữ cái liên tiếp. Định nghĩa này hoạt động trong nhiều ngữ cảnh nhưng điều đó có nghĩa là dấu nháy đơn trong các cơn co thắt và sở hữu tạo thành ranh giới từ, có thể không phải là kết quả mong muốn:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
"e g 3b"
kết quả mong muốn sẽ là "E G 3b"
. Tuy nhiên, "e g 3b".title()
trả lại "E G 3B"
.
In [2]: 'tEst'.title() Out[2]: 'Test'
Các .title()
phương pháp không thể làm việc tốt,
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Hãy thử string.capwords()
phương pháp,
import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
Từ các tài liệu python trên capwords :
Phân tách đối số thành các từ bằng cách sử dụng str.split (), viết hoa mỗi từ bằng str.capitalize () và nối các từ viết hoa bằng str.join (). Nếu sep đối số thứ hai tùy chọn không có hoặc Không có, các ký tự khoảng trắng được thay thế bằng một khoảng trắng và khoảng trắng ở đầu và cuối được loại bỏ, nếu không thì sep được sử dụng để phân tách và nối các từ.
"There once was a string with an 'that had words right after it and then closed'"
. Với ví dụ này, tất cả các thế giới ngoại trừ that
được viết hoa như mong đợi. Kết quả là"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
với các tình huống bình thường. Trong tình huống của tôi, title()
trả về một đầu ra xấu cho các tên có dấu hoặc dieresis, trong khi capwords()
xử lý nó một cách chính xác.
Chỉ vì điều này là thú vị đối với tôi, đây là hai giải pháp nữa.
Chia thành các từ, giới hạn ban đầu từng từ trong các nhóm được phân chia và tham gia lại. Điều này sẽ thay đổi khoảng trắng phân tách các từ thành một khoảng trắng duy nhất, bất kể đó là gì.
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
EDIT: Tôi không nhớ những gì tôi đã nghĩ lại khi tôi viết đoạn mã trên, nhưng không cần phải xây dựng một danh sách rõ ràng; chúng ta có thể sử dụng một biểu thức tạo để làm điều đó trong thời trang lười biếng. Vì vậy, đây là một giải pháp tốt hơn:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
Sử dụng một biểu thức chính quy để khớp với phần đầu của chuỗi hoặc các từ phân cách khoảng trắng, cộng với một ký tự không phải khoảng trắng; sử dụng dấu ngoặc đơn để đánh dấu "nhóm khớp". Viết hàm lấy một đối tượng khớp và trả về nhóm đối sánh khoảng trắng không thay đổi và nhóm khớp ký tự không phải khoảng trắng trong chữ hoa. Sau đó sử dụng re.sub()
để thay thế các mẫu. Cái này không có vấn đề về dấu câu của giải pháp đầu tiên, nó cũng không làm lại khoảng trắng như giải pháp đầu tiên của tôi. Điều này tạo ra kết quả tốt nhất.
import re
s = 'the brown fox'
def repl_func(m):
"""process regular expression match groups for word upper-casing problem"""
return m.group(1) + m.group(2).upper()
s = re.sub("(^|\s)(\S)", repl_func, s)
>>> re.sub("(^|\s)(\S)", repl_func, s)
"They're Bill's Friends From The UK"
Tôi rất vui vì tôi đã nghiên cứu câu trả lời này. Tôi không có ý tưởng re.sub()
có thể có một chức năng! Bạn có thể thực hiện xử lý không cần thiết bên trong re.sub()
để tạo ra kết quả cuối cùng!
string.capwords
làm, theo tài liệu trong câu trả lời của Chen Houwu.
Dưới đây là tóm tắt về các cách khác nhau để thực hiện, chúng sẽ hoạt động cho tất cả các đầu vào sau:
"" => ""
"a b c" => "A B C"
"foO baR" => "FoO BaR"
"foo bar" => "Foo Bar"
"foo's bar" => "Foo's Bar"
"foo's1bar" => "Foo's1bar"
"foo 1bar" => "Foo 1bar"
- Giải pháp đơn giản nhất là chia câu thành các từ và viết hoa chữ cái đầu tiên sau đó nối lại với nhau:
# Be careful with multiple spaces, and empty strings
# for empty words w[0] would cause an index error,
# but with w[:1] we get an empty string as desired
def cap_sentence(s):
return ' '.join(w[:1].upper() + w[1:] for w in s.split(' '))
- Nếu trước tiên bạn không muốn tách chuỗi đầu vào thành các từ và sử dụng các trình tạo ưa thích:
# Iterate through each of the characters in the string and capitalize
# the first char and any char after a blank space
from itertools import chain
def cap_sentence(s):
return ''.join( (c.upper() if prev == ' ' else c) for c, prev in zip(s, chain(' ', s)) )
- Hoặc không nhập itertools:
def cap_sentence(s):
return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )
- Hoặc bạn có thể sử dụng các biểu thức thông thường, từ câu trả lời của steveha :
# match the beginning of the string or a space, followed by a non-space
import re
def cap_sentence(s):
return re.sub("(^|\s)(\S)", lambda m: m.group(1) + m.group(2).upper(), s)
Bây giờ, đây là một số câu trả lời khác đã được đăng và đầu vào mà chúng không hoạt động như mong đợi nếu chúng ta sử dụng định nghĩa của một từ là bắt đầu câu hoặc bất cứ điều gì sau một khoảng trắng:
return s.title()
# Undesired outputs:
"foO baR" => "Foo Bar"
"foo's bar" => "Foo'S Bar"
"foo's1bar" => "Foo'S1Bar"
"foo 1bar" => "Foo 1Bar"
return ' '.join(w.capitalize() for w in s.split())
# or
import string
return string.capwords(s)
# Undesired outputs:
"foO baR" => "Foo Bar"
"foo bar" => "Foo Bar"
sử dụng '' cho phần tách sẽ khắc phục đầu ra thứ hai, nhưng capwords () vẫn không hoạt động cho lần đầu tiên
return ' '.join(w.capitalize() for w in s.split(' '))
# or
import string
return string.capwords(s, ' ')
# Undesired outputs:
"foO baR" => "Foo Bar"
Cẩn thận với nhiều chỗ trống
return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo bar" => "Foo Bar"
lower 123 upper
nên trả về lower 123 Upper
, trong đó upper
chữ viết hoa theo sau một số. Tôi biết nó vượt ra ngoài phạm vi câu hỏi của OP nhưng là một tiện ích bổ sung tuyệt vời cho câu trả lời đã được mở rộng của bạn. Cảm ơn trước.
"([0-9]+)(\s+.)"
thay vì "(^|\s)(\S)"
(khớp một hoặc nhiều số, theo sau là một hoặc nhiều khoảng trắng và bất kỳ ký tự nào sau) hoặc "([0-9]+)(\s*.)"
nếu bạn muốn viết hoa ký tự sau khoảng trắng '0 hoặc nhiều hơn' sau dấu cách số
WW1 - the great war
và đầu ra WW1 - The Great War
thay vì Ww1 ...
. Xem vấn đề với chữ viết tắt? Bạn có sẵn sàng để thêm một cái gì đó chứng minh trường hợp này? Tôi đã tự hỏi về điều này trong một thời gian và không thể nghĩ ra cách nào để làm điều đó.
WW1
sẽ xuất ra dưới dạngWW1
Phiên bản sao chép-dán sẵn sàng của @jibberia anwser:
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
str.join
chấp nhận máy phát điện.
join
chấp nhận gen exp, nhưng trong trường hợp str.join
đặc biệt, nó thường được ưu tiên sử dụng cách hiểu danh sách. Điều này là do join
lặp lại hai lần so với đối số và do đó nhanh hơn để cung cấp danh sách sẵn sàng hơn là một trình tạo.
str.join
cần phải lặp lại hai lần so với đối số? Tôi chỉ kiểm tra - không. Mặc dù đối với trình tự nhỏ, việc hiểu danh sách thực sự nhanh hơn.
Tại sao bạn làm phức tạp cuộc sống của bạn với tham gia và cho các vòng lặp khi giải pháp đơn giản và an toàn ??
Chỉ cần làm điều này:
string = "the brown fox"
string[0].upper()+string[1:]
"the brown fox".capitalize()
chứ?
'this is John'
thành 'This is john'
.
string.capitalize()
(về cơ bản là tiếng vang @luckydonald)
Nếu str.title () không phù hợp với bạn, hãy tự viết hoa.
Lót:
>>> ' '.join([s[0].upper() + s[1:] for s in "they're bill's friends from the UK".split(' ')])
"They're Bill's Friends From The UK"
Ví dụ rõ ràng:
input = "they're bill's friends from the UK"
words = input.split(' ')
capitalized_words = []
for word in words:
title_case_word = word[0].upper() + word[1:]
capitalized_words.append(title_case_word)
output = ' '.join(capitalized_words)
Nếu chỉ bạn muốn chữ cái đầu tiên:
>>> 'hello world'.capitalize()
'Hello world'
Nhưng để viết hoa từng chữ:
>>> 'hello world'.title()
'Hello World'
'hello New York'.capitalize()
là'Hello new york'
Một chuỗi trống sẽ phát sinh Lỗi nếu bạn truy cập [1:], do đó tôi sẽ sử dụng:
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
để viết hoa chữ cái đầu tiên
str.capitalize
cho?
return title[:1].upper() + title[1:]
cũng sẽ giải quyết vấn đề đó vì việc cắt chuỗi rỗng như thế sẽ tạo ra 2 chuỗi trống, kết hợp với nhau tạo thành một chuỗi trống được trả về
Như Mark đã chỉ ra, bạn nên sử dụng .title()
:
"MyAwesomeString".title()
Tuy nhiên, nếu muốn tạo chữ hoa đầu tiên trong mẫu django , bạn có thể sử dụng:
{{ "MyAwesomeString"|title }}
hoặc sử dụng một biến:
{{ myvar|title }}
Phương thức được đề xuất str.title () không hoạt động trong mọi trường hợp. Ví dụ:
string = "a b 3c"
string.title()
> "A B 3C"
thay vì "A B 3c"
.
Tôi nghĩ, tốt hơn là làm một cái gì đó như thế này:
def capitalize_words(string):
words = string.split(" ") # just change the split(" ") method
return ' '.join([word.capitalize() for word in words])
capitalize_words(string)
>'A B 3c'
Mặc dù tất cả các câu trả lời đã thỏa đáng nhưng tôi sẽ cố gắng bao gồm 2 trường hợp bổ sung cùng với tất cả các trường hợp trước đó.
nếu các không gian không đồng nhất và bạn muốn duy trì như cũ
string = hello world i am here.
nếu tất cả các chuỗi không bắt đầu từ bảng chữ cái
string = 1 w 2 r 3g
Ở đây bạn có thể sử dụng này
def solve(s):
a = s.split(' ')
for i in range(len(a)):
a[i]= a[i].capitalize()
return ' '.join(a)
cái này sẽ cho bạn
output = Hello World I Am Here
output = 1 W 2 R 3g
Tôi hy vọng điều này không dư thừa.
Để viết hoa ...
str = "this is string example.... wow!!!";
print "str.title() : ", str.title();
@ Gary02127 bình luận, bên dưới tiêu đề công việc giải pháp với dấu nháy đơn
import re
def titlecase(s):
return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", lambda mo: mo.group(0)[0].upper() + mo.group(0)[1:].lower(), s)
text = "He's an engineer, isn't he? SnippetBucket.com "
print(titlecase(text))
Đừng bỏ qua việc bảo tồn không gian màu trắng. Nếu bạn muốn xử lý 'fred flinstone'
và 'Fred Flinstone'
thay vào đó 'Fred Flinstone'
, bạn đã làm hỏng khoảng trắng của mình. Một số giải pháp trên sẽ mất khoảng trắng. Đây là một giải pháp tốt cho Python 2 và 3 và duy trì khoảng trắng.
def propercase(s):
return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
Một chức năng nhanh đã làm việc cho Python 3
Python 3.6.9 (default, Nov 7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> capitalizeFirtChar = lambda s: s[:1].upper() + s[1:]
>>> print(capitalizeFirtChar('помните своих Предковъ. Сражайся за Правду и Справедливость!'))
Помните своих Предковъ. Сражайся за Правду и Справедливость!
>>> print(capitalizeFirtChar('хай живе вільна Україна! Хай живе Любовь поміж нас.'))
Хай живе вільна Україна! Хай живе Любовь поміж нас.
>>> print(capitalizeFirtChar('faith and Labour make Dreams come true.'))
Faith and Labour make Dreams come true.
Viết hoa chuỗi với không gian không đồng nhất
Chà, tôi hiểu đây là một câu hỏi cũ và có lẽ câu trả lời gần như đã cạn kiệt, nhưng tôi muốn thêm vào điểm không gian không đồng nhất của @Amit Gupta. Từ câu hỏi ban đầu, chúng tôi muốn viết hoa từng từ trong chuỗi s = 'the brown fox'
. Điều gì xảy ra nếu chuỗi là s = 'the brown fox'
không gian không đồng nhất.
def solve(s):
# if you want to maintain the spaces in the string, s = 'the brown fox'
# use s.split(' ') instead of s.split().
# s.split() returns ['the', 'brown', 'fox']
# while s.split(' ') returns ['the', 'brown', '', '', '', '', '', 'fox']
capitalized_word_list = [word.capitalize() for word in s.split(' ')]
return ' '.join(capitalized_word_list)
** Trong trường hợp bạn muốn giảm kích thước **
#Assuming you are opening a new file
with open(input_file) as file:
lines = [x for x in reader(file) if x]
#for loop to parse the file by line
for line in lines:
name = [x.strip().lower() for x in line if x]
print(name) #check the result
Tôi thực sự thích câu trả lời này:
Phiên bản sao chép-dán sẵn sàng của @jibberia anwser:
def capitalize(line):
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])
Nhưng một số dòng mà tôi đã gửi đã tách ra một số ký tự '' trống gây ra lỗi khi cố gắng thực hiện s [1:]. Có lẽ có một cách tốt hơn để làm điều này, nhưng tôi đã phải thêm vào nếu len (s)> 0, như trong
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])
" ".join(w.capitalize() for w in s.split())