ตัวอย่าง:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
มีไลบรารีหรือวิธีมาตรฐานในการทำงานนี้หรือไม่?
ตัวอย่าง:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
มีไลบรารีหรือวิธีมาตรฐานในการทำงานนี้หรือไม่?
คำตอบ:
ทำไมไม่ใช้titleRight from the docs:
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
หากคุณต้องการ PascalCase จริงๆคุณสามารถใช้สิ่งนี้:
>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
title: "อัลกอริทึมใช้คำจำกัดความของคำที่ไม่ขึ้นกับภาษาเป็นกลุ่มของตัวอักษรที่ต่อเนื่องกันคำจำกัดความใช้ได้ในหลายบริบท แต่หมายความว่าเครื่องหมายอะพอสทรอฟีในการหดตัวและการเป็นเจ้าของทำให้เกิดขอบเขตคำ ซึ่งอาจไม่ใช่ผลลัพธ์ที่ต้องการ ". ทางออกหนึ่งที่เป็นไปได้คือใช้คำตอบของ Laurence กับ regex r"['\w]+"เพื่อไม่ให้เครื่องหมายวรรคตอนจบการแข่งขัน (สามารถเพิ่มเครื่องหมายวรรคตอนเพิ่มเติมได้ตามต้องการ)
'make IT camel CaSe'.title().replace(' ', '')ที่ผ่านมาเป็น
def toCamel(s): ret = ''.join(x for x in s.title() if not x.isspace()) return ret[0].lower() + ret[1:] การใช้งาน:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
อันนี้จะขึ้นต้นด้วยตัวพิมพ์เล็กเสมอและแถบอักขระที่ไม่ใช่ตัวเลขและตัวอักษร:
def camelCase(st):
output = ''.join(x for x in st.title() if x.isalnum())
return output[0].lower() + output[1:]
def capitalizeWords(s):
return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)
re.subสามารถใช้ฟังก์ชันสำหรับ "การแทนที่" (แทนที่จะเป็นเพียงสตริงซึ่งเป็นการใช้งานที่คนส่วนใหญ่ดูเหมือนจะคุ้นเคย) ฟังก์ชันการจำลองนี้จะถูกเรียกด้วยre.Matchออบเจ็กต์สำหรับการจับคู่แต่ละรูปแบบและผลลัพธ์ (ซึ่งควรเป็นสตริง) จะถูกใช้แทนการจับคู่นั้น
เวอร์ชันที่ยาวกว่าของสิ่งเดียวกัน:
WORD_RE = re.compile(r'\w+')
def capitalizeMatch(m):
return m.group(0).capitalize()
def capitalizeWords(s):
return WORD_RE.sub(capitalizeMatch, s)
สิ่งนี้รวบรวมรูปแบบไว้ล่วงหน้า (โดยทั่วไปถือว่าเป็นรูปแบบที่ดี) และใช้ฟังก์ชันที่ตั้งชื่อแทนแลมบ์ดา
matchจะถูกส่งผ่านไปยังฟังก์ชัน? และเนื่องจากmatchesในนิพจน์ทั่วไปมีกลุ่ม นั่นคือเหตุผลที่มีบรรทัดนี้lambda m:m.group(0).capitalize()?
re.subได้รับการเรียก (เช่นฟังก์ชัน) เป็น "การแทนที่" จะส่งผ่านวัตถุที่ตรงกันไปยังที่เรียกได้และคาดว่าจะได้รับสตริงกลับซึ่งเป็นสิ่งที่ใช้แทนได้จริง หากคุณพบว่า lambdas สับสน "เวอร์ชันที่ยาวขึ้น" จะทำสิ่งเดียวกันทุกประการในลักษณะที่ละเอียดกว่า
ทำไมไม่เขียนล่ะ สิ่งนี้อาจตอบสนองความต้องการของคุณ:
def FixCase(st):
return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
หมายเหตุ: เหตุใดฉันจึงให้คำตอบอื่น คำตอบนี้ขึ้นอยู่กับชื่อของคำถามและแนวคิดที่ว่า camelcase ถูกกำหนดให้เป็น: ชุดคำที่เรียงต่อกัน (ไม่เว้นวรรค!) โดยที่คำดั้งเดิมแต่ละคำขึ้นต้นด้วยอักษรตัวใหญ่ (ส่วนที่เหลือเป็นตัวพิมพ์เล็ก) ยกเว้นคำแรกของชุด (ซึ่งเป็นตัวพิมพ์เล็กทั้งหมด) นอกจากนี้ยังสันนิษฐานว่า "สตริงทั้งหมด" หมายถึงชุดอักขระ ASCII; Unicode จะใช้ไม่ได้กับโซลูชันนี้)
ด้วยคำจำกัดความข้างต้นฟังก์ชันนี้
import re
word_regex_pattern = re.compile("[^A-Za-z]+")
def camel(chars):
words = word_regex_pattern.split(chars)
return "".join(w.lower() if i is 0 else w.title() for i, w in enumerate(words))
เมื่อถูกเรียกจะส่งผลในลักษณะนี้
camel("San Francisco") # sanFrancisco
camel("SAN-FRANCISCO") # sanFrancisco
camel("san_francisco") # sanFrancisco
โปรดทราบว่าจะล้มเหลวเมื่อนำเสนอด้วยเชือกที่หุ้มอูฐอยู่แล้ว
camel("sanFrancisco") # sanfrancisco <-- noted limitation
โปรดทราบว่าล้มเหลวด้วยสตริง Unicode จำนวนมาก
camel("México City") # mXicoCity <-- can't handle unicode
ฉันไม่มีวิธีแก้ปัญหาสำหรับกรณีเหล่านี้ (หรืออย่างอื่นที่สามารถนำมาใช้กับความคิดสร้างสรรค์) ดังนั้นในทุกสิ่งที่เกี่ยวข้องกับสตริงให้ครอบคลุมเคสขอบของคุณเองและขอให้โชคดีกับ Unicode!
ห้องสมุดที่มีศักยภาพ: https://pypi.org/project/stringcase/
ตัวอย่าง:
import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
แม้ว่าจะเป็นที่น่าสงสัยว่าจะเว้นช่องว่างไว้หรือไม่ (ตัวอย่างแสดงให้เห็นว่าการลบช่องว่างออก แต่มีปัญหาตัวติดตามข้อผิดพลาดที่สังเกตว่ามันทิ้งไว้
เพียงแค่ใช้ .title () และมันจะแปลงตัวอักษรตัวแรกของทุกคำเป็นตัวพิมพ์ใหญ่โดยวางตัวเป็นตัวเล็ก:
>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
ฉันต้องการเพิ่มผลงานเล็กน้อยของฉันในโพสต์นี้:
def to_camelcase(str):
return ' '.join([t.title() for t in str.split()])
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d