পাইথনে স্ট্রিং কে টাইটেল কেসে রূপান্তর করবেন?


97

উদাহরণ:

HILO -> Hilo
new york -> New York
SAN FRANCISCO -> San Francisco

এই কাজটি সম্পাদন করার জন্য কি কোনও গ্রন্থাগার বা মানক উপায় রয়েছে?


16
এটি "ক্যামেলকেস" নয়, এটি "মূলধন"; আপনি কি চান?
অ্যান্ড্রু মার্শাল

13
উটকেস এটি পছন্দ করুন।
জোনাথন এম

4
আপনার উদাহরণগুলি প্যাসকেলকেস ব্যবহার করে।
ডেভিড বেটজ

উত্তর:


219

titleডক্স থেকে ডান ব্যবহার করুন না কেন :

>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"

আপনি যদি সত্যিই পাস্কেলকেস চাইতেন তবে আপনি এটি ব্যবহার করতে পারেন:

>>> ''.join(x for x in 'make IT pascal CaSe'.title() if not x.isspace())
'MakeItPascalCase'

4
আমি মনে করি "তারা" এর মধ্যে 'আর' ছোট হওয়া উচিত। এবং "বিলেস" এর 'গুলি' অবশ্যই অবশ্যই লোয়ার কেস হতে হবে।
ড্যানিয়েল ফিশার

4
@ ড্যানিয়েল - এই ইস্যুটির জন্য ডক্সগুলিতে উল্লেখ করা হয়েছে title: "অ্যালগরিদম একটানা অক্ষরের গোষ্ঠী হিসাবে একটি শব্দের একটি সাধারণ ভাষা-স্বতন্ত্র সংজ্ঞা ব্যবহার করে। সংজ্ঞাটি অনেকগুলি প্রসঙ্গে কাজ করে তবে এর অর্থ হ'ল সংকোচনগুলিতে অস্ট্রোফেসগুলি শব্দের সীমানা ধারণ করে, যা পছন্দসই ফলাফল নাও হতে পারে "। একটি সম্ভাব্য সমাধান হ'ল লরেন্সের উত্তরটি রেইজেক্সের সাথে ব্যবহার করা r"['\w]+"হবে যাতে অ্যাডাস্ট্রোফস কোনও ম্যাচটি শেষ না করে (অতিরিক্ত বিরামচিহ্ন প্রয়োজন হিসাবে যুক্ত করা যেতে পারে)।
অ্যান্ড্রু ক্লার্ক

18
রেকর্ডের জন্য, সর্বশেষ ক্যামেলকেস উদাহরণটি করার একটি নিকটতম উপায় হ'ল 'make IT camel CaSe'.title().replace(' ', '')
হেনরি গোমারসাল

15
অন্য কারও যদি মনে হয় যে তারা পাগল বড়িগুলিতে রয়েছে - এটি পাস্কেলকেস, উটকেস নয়।
রব

4
দুর্দান্ত কোড তবে উটকেস একটি ক্যাপিটাল দিয়ে শুরু হয় না। এটি চেষ্টা করুন: 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'
রন কালিয়ান

22

এইটি সর্বদা ছোট হাতের সাথে শুরু হবে এবং অক্ষরহীন অক্ষরগুলিও ছাঁটাবে:

def camelCase(st):
    output = ''.join(x for x in st.title() if x.isalnum())
    return output[0].lower() + output[1:]

8
def capitalizeWords(s):
  return re.sub(r'\w+', lambda m:m.group(0).capitalize(), s)

re.sub"প্রতিস্থাপন" এর জন্য একটি ফাংশন নিতে পারে (কেবল একটি স্ট্রিংয়ের চেয়ে, যা ব্যবহারটি বেশিরভাগ লোকের সাথে পরিচিত বলে মনে হয়)। এই Repl ফাংশনটি 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)

এটি প্যাটার্নটি প্রাক-সংকলন করে (সাধারণত ভাল ফর্ম হিসাবে বিবেচিত হয়) এবং ল্যাম্বদার পরিবর্তে একটি নামযুক্ত ফাংশন ব্যবহার করে।


এই এক সুন্দর ঝরঝরে, আমি ল্যাম্বদা ফাংশনগুলি ঘিরে আমার মাথা পেতে চেষ্টা করছি, সাহায্য করার জন্য আপনাকে ধন্যবাদ
দিবসী

4
@ জনম্যাচিন আমি কেবল জিজ্ঞাসা করেছি কারণ আমি ভেবেছিলাম যে কিছু ব্যাখ্যা যুক্ত করা আপনার উত্তর আরও সম্পূর্ণ এবং আরও ভাল করে তুলবে।
এনএন

@ লরেন্স গনসাল্ভস এখানে ল্যাম্বদা কী করছে?
জিয়ন

ল্যাম্বদা এখানে কি করছে? wha থেকে আমি সিদ্ধান্ত গ্রহণ করতে পারি এবং আপনার ব্যাখ্যা থেকে। এই আমি বুঝতে পেরেছি। আপনি re.sub এ কোন ফাংশন ব্যবহার করবেন তখন প্রতিটি matchফাংশনে পাস হবে? এবং যেহেতু matchesনিয়মিত অভিব্যক্তিতে গ্রুপ থাকে। কেন এই লাইন বিদ্যমান lambda m:m.group(0).capitalize()?
সিয়োন

@ জিয়ন হ্যাঁ যখন re.sub"রিপ্লেসমেন্ট" হিসাবে কলযোগ্য (যেমন: একটি ফাংশন) দেওয়া হয়, তখন এটি ম্যাচ অবজেক্টটিকে সেই কলযোগ্যটি পাস করে এবং একটি স্ট্রিং ফিরে পাওয়ার প্রত্যাশা করে যা এটি বাস্তবে প্রতিস্থাপন হিসাবে ব্যবহার করে। আপনি যদি ল্যাম্বডাসকে বিভ্রান্তকর মনে করেন, "দীর্ঘতর সংস্করণ" আরও একই শব্দটি আরও ভারবস করে দেয়।
লরেন্স গনসাল্ভেস

5

একটা লিখবে না কেন? এর মতো কিছু আপনার প্রয়োজনীয়তা পূরণ করতে পারে:

def FixCase(st):
    return ' '.join(''.join([w[0].upper(), w[1:].lower()]) for w in st.split())

ধন্যবাদ, এটি সম্পূর্ণরূপে সহায়তা করেছে আমার খারাপ, আমি প্রথম স্থানে একটি লিখতে ভাবিনি
দিবসী

5

দ্রষ্টব্য: কেন আমি আরও একটি উত্তর সরবরাহ করছি? এই উত্তরটি প্রশ্নের শিরোনাম এবং উটকেইস হিসাবে সংজ্ঞায়িত করা এই ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে: সংক্ষিপ্ত শব্দের একটি সিরিজ (কোনও ফাঁকা স্থান নেই!) যেমন প্রতিটি মূল শব্দ একটি মূল অক্ষর দিয়ে শুরু হয় (বাকী ছোট হাতের অক্ষর থাকে) সিরিজের প্রথম শব্দ ব্যতীত (যা সম্পূর্ণ ছোট হাতের অক্ষর)। এছাড়াও এটি ধরে নেওয়া হয় যে "সমস্ত স্ট্রিং" ASCII অক্ষর সেটকে বোঝায়; ইউনিকোড এই সমাধানটি নিয়ে কাজ করবে না)।

সরল

উপরোক্ত সংজ্ঞা দেওয়া, এই ফাংশন

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

এমনকি কম সহজ

নোট করুন যে এটি অনেকগুলি ইউনিকোড স্ট্রিং সহ ব্যর্থ হয়

camel("México City")    # mXicoCity     <-- can't handle unicode

এই কেসগুলির জন্য আমার কাছে কোনও সমাধান নেই (বা অন্যান্য যেগুলি কিছু সৃজনশীলতার সাথে পরিচিত হতে পারে)। সুতরাং, স্ট্রিংগুলির সাথে যা কিছু করতে হবে তার মতোই, আপনার নিজের প্রান্তের মামলাগুলি এবং ইউনিকোড দিয়ে শুভকামনা আবরণ করুন!


আপনি কীভাবে নির্ধারণ করতে পারেন যে বাক্যটির অর্থ না জেনে একটি স্ট্রিং উটের ক্ষেত্রে? আপনার "কম সহজ" উদাহরণে, "সানফ্র্যানসিস্কো" হ'ল উটের ক্ষেত্রে পাশাপাশি "#SnotcaMelcAse"।
প্যাট্রিস বার্নাসসোলা

আমি অনুমান করছি যে আপনার ইনপুটটিতে অ্যাস্ট্রাপেস বা অন্য বিরামচিহ্ন ছিল? আমার অন্যান্য ব্যর্থ ইনপুটটি নোট করা উচিত। অবশ্যই একটি ভাল ক্যাচ। আপনার দেওয়া ইনপুটটি কী ছিল?
মার্চ

4
আমার অর্থ স্থান ছাড়া অক্ষরের ক্রমের চেয়ে 1 শব্দ হিসাবে বিবেচনা করা উচিত। আপনি বাক্যটির অর্থ না জেনে এটি থেকে কাজ বের করতে পারবেন না। ক্যামেলো () এর ইনপুট হিসাবে "সানফ্রানসিস্কো" বা "#SnotcaMelcAse" রাখুন এবং আপনি দেখতে পাবেন যে আউটপুট একই হবে।
প্যাট্রিস বার্নাসসোলা

ওহ আমি দেখছি - হ্যাঁ, আমি মনে করি আপনি ঠিক বলেছেন। আমি সমাধান উপায়ে। আমি এটি আপডেট করব।
মার্চ

4

সম্ভাব্য গ্রন্থাগার: https://pypi.org/project/stringcase/

উদাহরণ:

import stringcase
stringcase.camelcase('foo_bar_baz') # => "fooBarBaz"

যদিও এটি ফাঁকা জায়গা ছেড়ে দেবে কিনা তা সন্দেহজনক (


হ্যাঁ হ্যাঁ একটি প্যাকেজ খুঁজছিলেন। এই প্যাকেজে স্নাককেস এবং অন্যান্য রূপান্তর ফাংশন রয়েছে।
s2t2

1

কেবলমাত্র টাইটেল () ব্যবহার করুন এবং এটি মূল শব্দের প্রথম শব্দের রূপান্তরিত করবে, বাকী ছোট থাকবে:

>>> a='mohs shahid ss'
>>> a.title()
'Mohs Shahid Ss'
>>> a='TRUE'
>>> b=a.title()
>>> b
'True'
>>> eval(b)
True

1

আমি এই পোস্টে আমার সামান্য অবদান যুক্ত করতে চাই:

def to_camelcase(str):
  return ' '.join([t.title() for t in str.split()])

আসলে, str.title () একই এবং আপনি গণনা ব্যয় সাশ্রয় করছেন।
অরোস 132

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.