ব্যতিক্রম একটি স্ট্রিং শিরোনাম


87

সেখানে পাইথন মধ্যে একটি আদর্শ উপায় একটি স্ট্রিং titlecase হয় (অর্থাত শব্দ বড়হাতের অক্ষর দিয়ে শুরু, সমস্ত অবশিষ্ট cased অক্ষর ছোট হাতের অক্ষর ব্যবহার আছে) কিন্তু মত রেখে নিবন্ধ and, inএবং oflowercased?

উত্তর:


151

এটির সাথে কয়েকটি সমস্যা রয়েছে। যদি আপনি বিভক্ত ব্যবহার করেন এবং যোগদান করেন তবে কিছু সাদা স্থানের অক্ষর উপেক্ষা করা হবে। অন্তর্নির্মিত মূলধন এবং শিরোনাম পদ্ধতি সাদা স্থান উপেক্ষা করে না।

>>> 'There     is a way'.title()
'There     Is A Way'

যদি কোনও বাক্য কোনও নিবন্ধ দিয়ে শুরু হয়, আপনি ছোট হাতের শিরোনামের প্রথম শব্দটি চান না।

এগুলি মাথায় রেখে:

import re 
def title_except(s, exceptions):
    word_list = re.split(' ', s)       # re.split behaves as expected
    final = [word_list[0].capitalize()]
    for word in word_list[1:]:
        final.append(word if word in exceptions else word.capitalize())
    return " ".join(final)

articles = ['a', 'an', 'of', 'the', 'is']
print title_except('there is a    way', articles)
# There is a    Way
print title_except('a whim   of an elephant', articles)
# A Whim   of an Elephant

কেন reপ্রয়োজনীয়? "".splitএকই কাজ করে একটি ফাংশন আছে ।
wizzwizz4

4
@ উইজউইফজ ৪: সংক্ষিপ্ত str.splitস্থান বিবেচনা করে না। re.splitস্থান ধরে রাখে। সুতরাং, এই ফাংশনটি কোনও স্থান খায় না।
ধীরোসৌর

@ ধীরোসৌর আমি ভেবেছিলাম যে "".split()সেগুলি বিবেচনা করে না তবে "".split(" ")করেছে।
wizzwizz4

আপনার স্নিপেট title_except('a whim of aN elephant', articles)মামলার জন্য সঠিকভাবে কাজ করবে না । আপনি word.lower() in exceptionsএটি ঠিক করতে ফিল্টারিং শর্ত ব্যবহার করতে পারেন ।
দরিউস ওয়ালকজাক

@ ধীরোসৌর আমি এমন কোনও শব্দকে মূলধন করার একটি উপায় খুঁজছি যা কেবল একটি নিবন্ধই নয় তবে একটি সংখ্যাও অনুসরণ করে। আপনি কি নিজের উত্তরের সাথে এটি যুক্ত করতে পারেন যা এটি প্রদর্শন করে? উদাহরণস্বরূপ , 2001 a Space Odysseyফিরে আসা উচিত 2001 A Space Odyssey, যেখানে aএটি একটি সংখ্যার অনুসরণ করে মূলধন হয়ে থাকে। আগাম ধন্যবাদ.
প্রোগ্রামার

54

টাইটেলিকেস.পি মডিউলটি ব্যবহার করুন ! শুধুমাত্র ইংরাজির জন্য কাজ করে।

>>> from titlecase import titlecase
>>> titlecase('i am a foobar bazbar')
'I Am a Foobar Bazbar'

গিটহাব: https://github.com/ppannuto/python-titlecase


4
আপনি রূপান্তর করছেন যে স্ট্রিংটিতে এর কোথাও একটি সংখ্যা রয়েছে তা যদি শিরোনামের মডিউলটি কাজ করে না।
ট্রয়

4
@ ট্রয় মনে হচ্ছে নম্বর ইস্যু ঠিক হয়ে গেছে, অথবা আমি আপনার প্রান্তের মামলায় আঘাত করি নি। উদাঃ শিরোনাম ('এক 4 দুই') -> 'ওয়ান 4 টু'। এখন শিরোনাম ('1one') -> '1one', তবে '1one'.title () ->' 1One '। যদিও এই পরবর্তী কেসটি একটি প্রান্তের মামলা এবং আমি নিশ্চিত না যে '1 এক' সঠিক শিরোনাম is আমি আমার ব্যাকরণ বইটি ধরতে যথেষ্ট উদ্বিগ্ন নই।
brent.payne

"321 একটি ব্রডওয়ে স্ট্রিট" এর ক্ষেত্রে কাজ করবে না যেখানে আমি "321 একটি ব্রডওয়ে স্ট্রিট" পাই। উপরে ধীরোসৌসারের প্রস্তাবিত সমাধানটি ব্যবহার করে "321 এ ব্রডওয়ে স্ট্রিট" তৈরি হয়।
মোরস্ক্র্যাচ

এছাড়াও দুর্দান্ত, এটি শিরোনামে সংক্ষিপ্ত শব্দটি রেখে দেয়। 'ইনোভেটিভ টিআইএএসআর এর বিকাশ' হয়ে ওঠে 'ইনোভেটিভ টিআইএএসআর এর বিকাশ'।
ম্যাথিয়াস আরাস

22

এই পদ্ধতি আছে:

>>> mytext = u'i am a foobar bazbar'
>>> print mytext.capitalize()
I am a foobar bazbar
>>> print mytext.title()
I Am A Foobar Bazbar

ছোট হাতের নিবন্ধের বিকল্প নেই। আপনাকে নিজেরাই কোড করতে হবে, সম্ভবত আপনি নিবন্ধগুলি কম করতে চান তার তালিকা ব্যবহার করে।


শিরোনাম।
টিআরএস -80

14

স্টুয়ার্ট কোলভিল একটি পাইথন পোর্ট করেছেন এর জন Gruber লেখা একটি পার্ল স্ক্রিপ্ট শিরোনাম ক্ষেত্রে রূপান্তর স্ট্রিং কিন্তু নিউ ইয়র্ক টাইমস থেকে নিয়ম রচনাশৈলী নির্দেশনা, সেইসাথে বিভিন্ন বিশেষ ক্ষেত্রে জন্য খাদ্য উপর ভিত্তি করে ছোট শব্দ ভিত্তি এড়াতে হবে।

এই লিপিগুলির কিছু চালাকতা:

  • তারা যদি ছোট শব্দগুলিকে মূলধন করে যেমন, যদি, চালু হয় তবে ইত্যাদি but তবে ইনপুটটিতে ভুল করে পুঁজি হলে সেগুলি আন-মূলধন করে।

  • স্ক্রিপ্টগুলি ধরে নিয়েছে যে প্রথম অক্ষর ব্যতীত অন্য বড় বড় অক্ষরের শব্দগুলি ইতিমধ্যে সঠিকভাবে মূলধন হয়ে গেছে। এর অর্থ তারা "আইটিউনস" বা "আইটিউনস" এর পরিবর্তে "আইটিউনস" এর মতো একটি শব্দ রেখে যাবে।

  • তারা লাইন বিন্দু দিয়ে কোনও শব্দ এড়িয়ে যায়; "Example.com" এবং "del.icio.us" ছোট হাতের অক্ষরে থাকবে।

  • তাদের কাছে বিশেষত "AT&T" এবং "প্রশ্নোত্তর" এর মতো বিজোড় মামলার সাথে মোকাবিলা করার জন্য হার্ড-কোডড হ্যাক রয়েছে, যার উভয়টিতেই ছোট শব্দ রয়েছে (এ এবং এ) যা সাধারণত ছোট হাতের হওয়া উচিত।

  • শিরোনামের প্রথম এবং শেষ শব্দটি সর্বদা মূলধনযুক্ত, সুতরাং "ভয় পাওয়ার কিছু নেই" এর মতো ইনপুটটিকে "কিছুই ভয় পাওয়ার ভয় নেই" তে রূপান্তরিত করা হবে।

  • কোলনের পরে একটি ছোট শব্দ মূলধন হবে।

আপনি এটি এখানে ডাউনলোড করতে পারেন ।


4
capitalize (word)

এটি করা উচিত। আমি এটি অন্যভাবে পেতে।

>>> mytext = u'i am a foobar bazbar'
>>> mytext.capitalize()
u'I am a foobar bazbar'
>>>

উপরের উত্তরে যেমন বলা হয়েছে ঠিক আছে, আপনাকে একটি কাস্টম মূলধন করতে হবে:

মাইটিেক্সট = আপনি 'আমি একটি ফুবার বাজবার'

def xcaptilize(word):
    skipList = ['a', 'an', 'the', 'am']
    if word not in skipList:
        return word.capitalize()
    return word

k = mytext.split(" ") 
l = map(xcaptilize, k)
print " ".join(l)   

এই ফলাফল

I am a Foobar Bazbar

এটাই আমি চাই না। আমি পেতে "আমি একটি FOOBAR Bazbar am" চান
ইয়াসিন

@ ইয়াসিন ইজবাখে: আমার উত্তর সম্পাদনা করেছেন, এটি আপনার পক্ষে কাজ করা উচিত। নিবন্ধগুলির তালিকা যেকোন অভিধান থেকে সহজেই তোলা যাবে
পাইফুঙ্ক

2

পাইথন ২.7 এর শিরোনাম পদ্ধতিতে এর ত্রুটি রয়েছে।

value.title()

ছুতার 'ফিরে আসবে এস সহকারী যখন মান ছুতার হল' গুলি সহকারী

স্টুয়ার্ট কলভিলির টাইটলেজ ব্যবহার করে @ বায়োজিইকের সেরা সমাধানটি সম্ভবত। যা ইটিয়েন প্রস্তাবিত একই সমাধান।


1
 not_these = ['a','the', 'of']
thestring = 'the secret of a disappointed programmer'
print ' '.join(word
               if word in not_these
               else word.title()
               for word in thestring.capitalize().split(' '))
"""Output:
The Secret of a Disappointed Programmer
"""

শিরোনাম মূলধনী শব্দের সাথে শুরু হয় এবং এটি নিবন্ধটির সাথে মেলে না।


1

তালিকা অনুধাবন এবং টের্নারি অপারেটর ব্যবহার করে ওয়ান-লাইনার

reslt = " ".join([word.title() if word not in "the a on in of an" else word for word in "Wow, a python one liner for titles".split(" ")])
print(reslt)

ভাঙ্গন:

for word in "Wow, a python one liner for titles".split(" ") স্ট্রিংটিকে একটি তালিকায় বিভক্ত করে লুপের জন্য সূচনা করে (তালিকার বোঝার মধ্যে)

word.title() if word not in "the a on in of an" else wordtitle()যদি কোনও নিবন্ধ না হয় তবে স্ট্রিং কেসের ক্ষেত্রে নেটিভ পদ্ধতি ব্যবহার করে

" ".join (স্পেস) এর পৃথক দিয়ে তালিকার উপাদানগুলিতে যোগ দেয়


0

একটি গুরুত্বপূর্ণ ক্ষেত্রে যা বিবেচনা করা হচ্ছে না তা হ'ল সংক্ষিপ্ত শব্দগুলি (পাইথন-টাইটেলিকাস দ্রবণটি সংক্ষিপ্ত আকারগুলি হ্যান্ডেল করতে পারে যদি আপনি স্পষ্টভাবে ব্যতিক্রম হিসাবে তাদের সরবরাহ করেন)। আমি কেবল ডাউন-কেসিং এড়াতে পছন্দ করি। এই পদ্ধতির সাথে, ইতিমধ্যে বড় আকারের সংক্ষিপ্ত রূপগুলি উচ্চতর ক্ষেত্রে থেকে যায়। নিম্নলিখিত কোডটি মূলত ধীরোসর দ্বারা সরবরাহিত একটি সংশোধন।

# This is an attempt to provide an alternative to ''.title() that works with 
# acronyms.
# There are several tricky cases to worry about in typical order of importance:
# 0. Upper case first letter of each word that is not an 'minor' word.
# 1. Always upper case first word.
# 2. Do not down case acronyms
# 3. Quotes
# 4. Hyphenated words: drive-in
# 5. Titles within titles: 2001 A Space Odyssey
# 6. Maintain leading spacing
# 7. Maintain given spacing: This is a test.  This is only a test.

# The following code addresses 0-3 & 7.  It was felt that addressing the others 
# would add considerable complexity.


def titlecase(
    s,
    exceptions = (
        'and', 'or', 'nor', 'but', 'a', 'an', 'and', 'the', 'as', 'at', 'by',
        'for', 'in', 'of', 'on', 'per', 'to'
    )
):
    words = s.strip().split(' ')
        # split on single space to maintain word spacing
        # remove leading and trailing spaces -- needed for first word casing

    def upper(s):
        if s:
            if s[0] in '‘“"‛‟' + "'":
                return s[0] + upper(s[1:])
            return s[0].upper() + s[1:]
        return ''

    # always capitalize the first word
    first = upper(words[0])

    return ' '.join([first] + [
        word if word.lower() in exceptions else upper(word)
        for word in words[1:]
    ])


cases = '''
    CDC warns about "aggressive" rats as coronavirus shuts down restaurants
    L.A. County opens churches, stores, pools, drive-in theaters
    UConn senior accused of killing two men was looking for young woman
    Giant asteroid that killed the dinosaurs slammed into Earth at ‘deadliest possible angle,’ study reveals
    Maintain given spacing: This is a test.  This is only a test.
'''.strip().splitlines()

for case in cases:
    print(titlecase(case))

রান করার সময় এটি নিম্নলিখিতটি তৈরি করে:

CDC Warns About "Aggressive" Rats as Coronavirus Shuts Down Restaurants L.A. County Opens Churches, Stores, Pools, Drive-in Theaters
UConn Senior Accused of Killing Two Men Was Looking for Young Woman
Giant Asteroid That Killed the Dinosaurs Slammed Into Earth at ‘Deadliest Possible Angle,’ Study Reveals
Maintain Given Spacing: This Is a Test.  This Is Only a Test.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.