s = 'the brown fox'
... ทำอะไรที่นี่ ...
s
ควรจะเป็น :
'The Brown Fox'
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?
s = 'the brown fox'
... ทำอะไรที่นี่ ...
s
ควรจะเป็น :
'The Brown Fox'
วิธีที่ง่ายที่สุดในการทำเช่นนี้คืออะไร?
คำตอบ:
.title()
วิธีการของสตริง (ทั้ง ASCII หรือ Unicode เป็นดี) ไม่นี้:
>>> "hello world".title()
'Hello World'
>>> u"hello world".title()
u'Hello World'
อย่างไรก็ตามให้ระวังสตริงที่มีเครื่องหมายอัญประกาศเดี่ยวฝังอยู่ดังที่ระบุไว้ในเอกสาร
อัลกอริทึมใช้คำนิยามที่ไม่ขึ้นกับภาษาอย่างง่ายของคำว่าเป็นกลุ่มของตัวอักษรที่ต่อเนื่องกัน คำนิยามใช้งานได้ในหลายบริบท แต่ก็หมายความว่าอะพอสโทรฟีในการหดตัวและการครอบครองครอบครองเป็นขอบเขตของคำซึ่งอาจไม่เป็นผลลัพธ์ที่ต้องการ:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
"e g 3b"
"E G 3b"
อย่างไรก็ตามผลตอบแทน"e g 3b".title()
"E G 3B"
In [2]: 'tEst'.title() Out[2]: 'Test'
.title()
วิธีการไม่สามารถทำงานได้ดี
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
ลองstring.capwords()
วิธี
import string
string.capwords("they're bill's friends from the UK")
>>>"They're Bill's Friends From The Uk"
แยกอาร์กิวเมนต์ออกเป็นคำโดยใช้ str.split () ใช้ตัวพิมพ์ใหญ่แต่ละคำโดยใช้ str.capitalize () และเข้าร่วมคำที่เป็นตัวพิมพ์ใหญ่โดยใช้ str.join () หากอาร์กิวเมนต์ที่สองทางเลือก sep ขาดหรือไม่มีการเรียกใช้อักขระช่องว่างจะถูกแทนที่ด้วยช่องว่างเดียวและช่องว่างนำหน้าและต่อท้ายจะถูกลบออกมิฉะนั้น sep จะใช้เพื่อแยกและเข้าร่วมคำ
"There once was a string with an 'that had words right after it and then closed'"
ยังขาดและไม่ได้จัดการกับบางสิ่งบางอย่างเช่น ด้วยตัวอย่างนี้ทุกภพยกเว้นthat
จะได้รับทุนตามที่คาดไว้ ผลลัพธ์ที่ได้คือ"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
สำหรับสถานการณ์ปกติ ในสถานการณ์ของฉันtitle()
ส่งคืนเอาต์พุตที่ไม่ถูกต้องสำหรับชื่อที่มีเครื่องหมายเน้นเสียงหรือการกำหนดค่าในขณะcapwords()
จัดการอย่างถูกต้อง
เพียงเพราะสิ่งแบบนี้สนุกสำหรับฉันนี่คือคำตอบอีกสองข้อ
แบ่งออกเป็นคำเริ่มต้นขีดแต่ละคำจากกลุ่มแยกและเข้าร่วมอีกครั้ง สิ่งนี้จะเปลี่ยนพื้นที่สีขาวโดยแยกคำเป็นพื้นที่สีขาวเดียวไม่ว่าจะเป็นอะไร
s = 'the brown fox'
lst = [word[0].upper() + word[1:] for word in s.split()]
s = " ".join(lst)
แก้ไข: ฉันจำไม่ได้ว่าฉันคิดถึงอะไรเมื่อฉันเขียนโค้ดด้านบน แต่ไม่จำเป็นต้องสร้างรายการที่ชัดเจน เราสามารถใช้นิพจน์ตัวสร้างเพื่อทำในลักษณะขี้เกียจ ดังนั้นนี่คือทางออกที่ดีกว่า:
s = 'the brown fox'
s = ' '.join(word[0].upper() + word[1:] for word in s.split())
ใช้นิพจน์ทั่วไปเพื่อจับคู่จุดเริ่มต้นของสตริงหรือการเว้นวรรคคำสีขาวรวมทั้งอักขระที่ไม่ใช่ช่องว่างเดี่ยว ใช้วงเล็บเพื่อทำเครื่องหมาย "กลุ่มการจับคู่" เขียนฟังก์ชั่นที่จะจับคู่วัตถุและส่งคืนกลุ่มการจับคู่ white space และกลุ่มการจับคู่อักขระที่ไม่ใช่ whitespace ในกรณีส่วนบน จากนั้นใช้re.sub()
เพื่อแทนที่รูปแบบ อันนี้ไม่มีปัญหาเครื่องหมายวรรคตอนของวิธีแก้ปัญหาแรกและไม่ทำซ้ำพื้นที่สีขาวเหมือนวิธีแก้ปัญหาแรกของฉัน อันนี้ให้ผลลัพธ์ที่ดีที่สุด
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"
ฉันดีใจที่ฉันค้นคว้าคำตอบนี้ ฉันไม่รู้ว่าre.sub()
จะใช้ฟังก์ชั่นได้! คุณสามารถทำการประมวลผลแบบไร้สาระภายในre.sub()
เพื่อสร้างผลลัพธ์สุดท้าย!
string.capwords
ทำตามเอกสารในคำตอบของ Chen Houwu
ต่อไปนี้เป็นบทสรุปของวิธีการที่แตกต่างกันในการดำเนินการพวกเขาจะทำงานได้กับอินพุตเหล่านี้ทั้งหมด:
"" => ""
"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"
- ทางออกที่ง่ายที่สุดคือการแบ่งประโยคเป็นคำและใช้ตัวอักษรตัวแรกจากนั้นรวมเข้าด้วยกัน:
# 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(' '))
- หากคุณไม่ต้องการแยกสตริงอินพุตให้เป็นคำก่อนและใช้ตัวสร้างแฟนซี:
# 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)) )
- หรือไม่มีการนำเข้าเครื่องมือจัดการ:
def cap_sentence(s):
return ''.join( (c.upper() if i == 0 or s[i-1] == ' ' else c) for i, c in enumerate(s) )
- หรือคุณสามารถใช้การแสดงออกปกติจากคำตอบของ 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)
ต่อไปนี้เป็นคำตอบอื่น ๆที่โพสต์และอินพุตที่ใช้ไม่ได้ตามที่คาดไว้หากเราใช้คำจำกัดความของคำว่าเป็นจุดเริ่มต้นของประโยคหรืออะไรก็ตามหลังจากช่องว่าง:
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"
การใช้ '' สำหรับการแยกจะแก้ไขเอาต์พุตที่สอง แต่ capwords () ยังคงใช้งานไม่ได้ในครั้งแรก
return ' '.join(w.capitalize() for w in s.split(' '))
# or
import string
return string.capwords(s, ' ')
# Undesired outputs:
"foO baR" => "Foo Bar"
ระวังช่องว่างหลาย ๆ ช่อง
return ' '.join(w[0].upper() + w[1:] for w in s.split())
# Undesired outputs:
"foo bar" => "Foo Bar"
lower 123 upper
ควรคืนค่าlower 123 Upper
โดยให้upper
เป็นตัวพิมพ์ใหญ่ตามหลังตัวเลข ฉันรู้ว่ามันเกินขอบเขตของคำถามของ OP แต่เป็นส่วนเสริมที่ดีสำหรับคำตอบที่กว้างขวางของคุณ ขอบคุณล่วงหน้า.
"([0-9]+)(\s+.)"
แทน"(^|\s)(\S)"
(จับคู่หนึ่งหมายเลขหรือมากกว่าตามด้วยช่องว่างอย่างน้อยหนึ่งช่องและอักขระใด ๆ หลังจากนั้น) หรือ "([0-9]+)(\s*.)"
ถ้าคุณต้องการใช้ประโยชน์จากตัวอักษรหลังจากช่องว่าง 'ศูนย์หรือมากกว่า' หลังจาก หมายเลข
WW1 - the great war
และเอาท์พุทWW1 - The Great War
แทนWw1 ...
ได้อย่างไร ดูปัญหาเกี่ยวกับตัวย่อหรือไม่ คุณยินดีที่จะเพิ่มสิ่งที่แสดงให้เห็นถึงกรณีนี้หรือไม่? ฉันสงสัยเกี่ยวกับเรื่องนี้มาระยะหนึ่งแล้วและไม่สามารถคิดวิธีที่จะทำได้
WW1
จะแสดงผลลัพธ์เป็นWW1
รุ่นคัดลอกวางวางของ @jibberia anwser:
def capitalize(line):
return ' '.join(s[:1].upper() + s[1:] for s in line.split(' '))
str.join
ยอมรับเครื่องกำเนิดไฟฟ้า
join
ยอมรับ exps ของ Gen ในกรณีของstr.join
โดยเฉพาะอย่างยิ่งมันเป็นที่ต้องการโดยทั่วไปที่จะใช้รายการความเข้าใจ นี่เป็นเพราะjoin
วนซ้ำสองครั้งในการโต้แย้งและด้วยเหตุนี้จึงเร็วกว่าที่จะจัดเตรียมรายการที่พร้อมจะไปแทนที่จะเป็นเครื่องกำเนิด
str.join
ต้องวนซ้ำสองครั้งในการโต้แย้ง? ฉันเพิ่งตรวจสอบ - มันไม่ได้ แม้ว่าความเข้าใจในรายการลำดับเล็ก ๆ จะเร็วขึ้นแน่นอน
ทำไมคุณถึงทำให้ชีวิตคุณยุ่งเหยิงด้วยการรวมตัวและวนซ้ำเมื่อการแก้ปัญหานั้นง่ายและปลอดภัย?
แค่ทำสิ่งนี้:
string = "the brown fox"
string[0].upper()+string[1:]
"the brown fox".capitalize()
หรือไม่
'this is John'
'This is john'
string.capitalize()
(โดยพื้นฐานแล้วสะท้อน @luckydonald)
หาก str.title () ไม่ได้ผลสำหรับคุณให้ใช้อักษรตัวพิมพ์ใหญ่ด้วยตัวเอง
หนึ่งในสายการบิน:
>>> ' '.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"
ตัวอย่างที่ชัดเจน:
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)
ถ้าคุณเพียงต้องการอักษรตัวแรก:
>>> 'hello world'.capitalize()
'Hello world'
แต่จะใช้ประโยชน์จากแต่ละคำ:
>>> 'hello world'.title()
'Hello World'
'hello New York'.capitalize()
is'Hello new york'
สตริงว่างจะเพิ่มข้อผิดพลาดหากคุณเข้าถึง [1:] ดังนั้นฉันจะใช้:
def my_uppercase(title):
if not title:
return ''
return title[0].upper() + title[1:]
เพื่อพิมพ์ใหญ่อักษรตัวแรกเท่านั้น
str.capitalize
มีไว้เพื่ออะไร
return title[:1].upper() + title[1:]
ก็จะดูแลปัญหานั้นตั้งแต่การตัดสตริงว่างเช่นที่จะให้ 2 สตริงว่างร่วมกันทำสตริงว่างซึ่งจะถูกส่งกลับ
ตามที่มาร์คชี้ให้เห็นคุณควรใช้.title()
:
"MyAwesomeString".title()
อย่างไรก็ตามหากต้องการสร้างตัวอักษรตัวใหญ่ตัวแรกในแม่แบบ djangoคุณสามารถใช้สิ่งนี้:
{{ "MyAwesomeString"|title }}
หรือใช้ตัวแปร:
{{ myvar|title }}
วิธีการที่แนะนำ str.title () ไม่สามารถใช้งานได้ในทุกกรณี ตัวอย่างเช่น:
string = "a b 3c"
string.title()
> "A B 3C"
"A B 3c"
แทน
ฉันคิดว่ามันจะดีกว่าที่จะทำสิ่งนี้:
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'
แม้ว่าคำตอบทั้งหมดจะได้รับความพึงพอใจอยู่แล้ว แต่ฉันจะพยายามครอบคลุม 2 กรณีเพิ่มเติมพร้อมกับคดีก่อนหน้าทั้งหมด
ถ้าช่องว่างไม่เหมือนกันและคุณต้องการคงไว้เหมือนเดิม
string = hello world i am here.
ถ้าสตริงทั้งหมดไม่ได้เริ่มต้นจากตัวอักษร
string = 1 w 2 r 3g
ที่นี่คุณสามารถใช้สิ่งนี้
def solve(s):
a = s.split(' ')
for i in range(len(a)):
a[i]= a[i].capitalize()
return ' '.join(a)
สิ่งนี้จะทำให้คุณ
output = Hello World I Am Here
output = 1 W 2 R 3g
ฉันหวังว่านี่จะไม่ซ้ำซ้อน
เพื่อใช้ประโยชน์คำ ...
str = "this is string example.... wow!!!";
print "str.title() : ", str.title();
@ ความคิดเห็น Gary02127 ด้านล่างชื่องานแก้ปัญหาด้วย apostrophe
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))
อย่ามองข้ามการอนุรักษ์พื้นที่สีขาว หากคุณต้องการประมวลผล'fred flinstone'
และได้รับ'Fred Flinstone'
แทนคุณ'Fred Flinstone'
ได้ทำลายพื้นที่สีขาวของคุณ การแก้ปัญหาข้างต้นบางอย่างจะเสียพื้นที่สีขาว นี่คือวิธีแก้ปัญหาที่ดีสำหรับ Python 2 และ 3 และรักษาพื้นที่สีขาว
def propercase(s):
return ''.join(map(''.capitalize, re.split(r'(\s+)', s)))
ฟังก์ชั่นการทำงานอย่างรวดเร็วสำหรับ 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.
ใช้ประโยชน์สตริงด้วยช่องว่างที่ไม่สม่ำเสมอ
ฉันเข้าใจว่านี่เป็นคำถามเก่าและอาจเป็นคำตอบที่เกือบจะ exhausited แต่ฉันต้องการเพิ่มในจุดของ @Amit Gupta ของช่องว่างที่ไม่สม่ำเสมอ s = 'the brown fox'
จากคำถามเดิมเราต้องการที่จะลงทุนทุกคำในสตริง เกิดอะไรขึ้นถ้าสตริงนั้นs = 'the brown fox'
มีช่องว่างที่ไม่สม่ำเสมอ
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)
** ในกรณีที่คุณต้องการลดขนาด **
#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
ฉันชอบคำตอบนี้จริงๆ:
รุ่นคัดลอกวางวางของ @jibberia anwser:
def capitalize(line):
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ')])
แต่บางส่วนของบรรทัดที่ฉันส่งแยกออกอักขระบางตัวที่ว่างเปล่าซึ่งทำให้เกิดข้อผิดพลาดเมื่อพยายามทำ [1:] อาจเป็นวิธีที่ดีกว่าในการทำเช่นนี้ แต่ฉันต้องเพิ่มในถ้า len (s)> 0 เช่นเดียวกับใน
return ' '.join([s[0].upper() + s[1:] for s in line.split(' ') if len(s)>0])
" ".join(w.capitalize() for w in s.split())