Thí dụ:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Có thư viện hoặc cách tiêu chuẩn để thực hiện tác vụ này không?
Thí dụ:
HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco
Có thư viện hoặc cách tiêu chuẩn để thực hiện tác vụ này không?
Câu trả lời:
Tại sao không sử dụng titleNgay từ tài liệu:
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
Nếu bạn thực sự muốn PascalCase, bạn có thể sử dụng cái này:
>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'
title: "Thuật toán sử dụng một định nghĩa đơn giản không phụ thuộc vào ngôn ngữ của một từ dưới dạng các nhóm các chữ cái liên tiếp. Định nghĩa này hoạt động trong nhiều ngữ cảnh nhưng nó có nghĩa là dấu nháy đơn trong các từ co và sở hữu tạo thành ranh giới từ, mà có thể không phải là kết quả mong muốn ". Một giải pháp khả thi là sử dụng câu trả lời của Laurence với regex r"['\w]+"để dấu nháy đơn không kết thúc một kết quả khớp (có thể thêm dấu câu bổ sung nếu cần).
'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:] Cách sử dụng:toCamel("WRITE this in camelcase") 'writeThisInCamelcase'
Cái này sẽ luôn bắt đầu bằng chữ thường và cũng tách các ký tự không phải chữ và số:
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.subcó thể nhận một hàm cho "thay thế" (thay vì chỉ một chuỗi, đây là cách sử dụng mà hầu hết mọi người dường như quen thuộc). Hàm repl này sẽ được gọi với một re.Matchđối tượng cho mỗi trận đấu của mẫu và kết quả (phải là một chuỗi) sẽ được sử dụng thay thế cho kết quả phù hợp đó.
Một phiên bản dài hơn của cùng một thứ:
WORD_RE = re.compile(r'\w+')
def capitalizeMatch(m):
return m.group(0).capitalize()
def capitalizeWords(s):
return WORD_RE.sub(capitalizeMatch, s)
Điều này sẽ biên dịch trước mẫu (thường được coi là dạng tốt) và sử dụng một hàm được đặt tên thay vì lambda.
matchsẽ được chuyển cho hàm? và vì matchestrong biểu thức chính quy có nhóm. đó là lý do tại sao dòng này tồn tại lambda m:m.group(0).capitalize()?
re.subđược cung cấp một có thể gọi (ví dụ: một hàm) làm "thay thế", nó sẽ chuyển đối tượng so khớp đến có thể gọi đó và mong đợi nhận lại một chuỗi mà nó thực sự sử dụng để thay thế. Nếu bạn thấy lambdas khó hiểu, "phiên bản dài hơn" thực hiện chính xác điều tương tự theo cách dài dòng hơn.
Tại sao không viết một? Một cái gì đó như thế này có thể đáp ứng yêu cầu của bạn:
def FixCase(st):
return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())
Lưu ý: Tại sao tôi lại đưa ra một câu trả lời khác? Câu trả lời này dựa trên tiêu đề của câu hỏi và khái niệm rằng camelcase được định nghĩa là: một loạt các từ đã được nối (không có dấu cách!) Sao cho mỗi từ ban đầu bắt đầu bằng một ký tự viết hoa (phần còn lại là chữ thường) ngoại trừ từ đầu tiên của chuỗi (hoàn toàn là chữ thường). Ngoài ra, giả định rằng "tất cả các chuỗi" đề cập đến bộ ký tự ASCII; unicode sẽ không hoạt động với giải pháp này).
Với định nghĩa trên, hàm này
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))
, khi được gọi, sẽ dẫn đến theo cách này
camel("San Francisco") # sanFrancisco
camel("SAN-FRANCISCO") # sanFrancisco
camel("san_francisco") # sanFrancisco
Lưu ý rằng nó không thành công khi được trình bày với một chuỗi có vỏ bọc lạc đà!
camel("sanFrancisco") # sanfrancisco <-- noted limitation
Lưu ý rằng nó không thành công với nhiều chuỗi unicode
camel("México City") # mXicoCity <-- can't handle unicode
Tôi không có giải pháp cho những trường hợp này (hoặc những trường hợp khác có thể được giới thiệu với một số sáng tạo). Vì vậy, như trong tất cả những thứ liên quan đến chuỗi, hãy che các trường hợp cạnh của bạn và chúc may mắn với unicode!
Thư viện tiềm năng: https://pypi.org/project/stringcase/
Thí dụ:
import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"
Mặc dù có vấn đề là liệu nó có để lại khoảng trống hay không. (Các ví dụ cho thấy nó xóa khoảng trắng, nhưng có một vấn đề của trình theo dõi lỗi lưu ý rằng nó sẽ để lại chúng).
chỉ cần sử dụng .title () và nó sẽ chuyển đổi chữ cái đầu tiên của mỗi từ thành chữ hoa, phần còn lại là nhỏ:
>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True
def camelCase(st):
s = st.title()
d = "".join(s.split())
d = d.replace(d[0],d[0].lower())
return d