अपवाद के साथ एक स्ट्रिंग शीर्षक


87

वहाँ पायथन में एक मानक तरीका एक स्ट्रिंग titlecase है (यानी शब्द अपरकेस वर्णों के साथ शुरू, सभी शेष मामलों वर्ण लोअरकेस है), लेकिन जैसे छोड़ने लेख and, inऔर ofलोवरकेस?

जवाबों:


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

1
@ wizzwizz4: 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यह संख्या के रूप में पूंजीकृत है। अग्रिम में धन्यवाद।
प्रोग्रामर

53

टाइटलकेसहोम मॉड्यूल का उपयोग करें ! केवल अंग्रेजी के लिए काम करता है।

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

गिटहब: https://github.com/ppannuto/python-titlecase


1
टाइटलकेस मॉड्यूल काम नहीं करता है यदि आप जिस स्ट्रिंग को परिवर्तित कर रहे हैं उसमें एक संख्या होती है।
ट्रॉय

1
@ ट्रॉय को लगता है कि नंबर इश्यू तय है, या मैंने आपका एज केस नहीं मारा है। पूर्व: शीर्षक ('एक 4 दो') -> 'एक 4 दो'। अब शीर्षक ('1one') -> '1one', लेकिन '1one'.title () ->' 1one '। हालांकि यह बाद का मामला एक किनारे का मामला है और मुझे यकीन नहीं है कि '1One' सही शीर्षक है। मुझे अपनी व्याकरण पुस्तक को हथियाने के लिए पर्याप्त चिंता नहीं है।
brent.payne

"321 ए ब्रोडवे स्ट्रीट" के मामले में काम नहीं करूँगा जहाँ मुझे "321 ए ब्रॉडवे स्ट्रीट" मिलता है। ऊपर धीरोसोर द्वारा प्रस्तावित समाधान का उपयोग करना "321 ए ब्रॉडवे स्ट्रीट" का उत्पादन करता है।
मोरेक्रैच

इसके अलावा अच्छा है, यह शीर्षक से अछूता छोड़ देता है। 'नवीन TIASR का विकास' 'नवीन TIASR का विकास' बन जाता है।
मथायस अरस

22

ये तरीके हैं:

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

कोई लोअरकेस लेख विकल्प नहीं है। आपको अपने आप को यह कोड करना होगा कि शायद उन लेखों की एक सूची का उपयोग करके जिन्हें आप कम करना चाहते हैं।


titlecase.py लेखों को कम करता है।
TRS-80

14

स्टुअर्ट कॉलविले ने जॉन ग्रबेर द्वारा लिखित एक पर्ल स्क्रिप्ट का पायथन पोर्ट बनाया है, जो स्ट्रिंग्स को टाइटल केस में परिवर्तित करने के लिए है, लेकिन न्यू यॉर्क टाइम्स मैनुअल की शैली के नियमों के आधार पर छोटे शब्दों को कैपिटलाइज़ करने से बचता है, साथ ही कई अन्य मामलों के लिए खानपान भी करता है।

इन लिपियों की कुछ चतुराई:

  • वे छोटे शब्दों को कैपिटलाइज़ करते हैं जैसे कि, इन, ऑन , वगैरह, लेकिन अगर वे इनपुट में गलत तरीके से कैपिटल किए गए हैं, तो उन्हें अन-कैपिटल करेंगे।

  • लिपियाँ मानती हैं कि पहले अक्षर के अलावा अन्य बड़े अक्षरों वाले शब्द पहले से ही सही ढंग से पूँजीकृत हैं। इसका मतलब है कि वे "आईट्यून्स" जैसे शब्द को अकेले छोड़ देंगे, बजाय इसे "आईट्यून्स" या इससे भी बदतर, "इट्यून्स" में।

  • वे लाइन डॉट्स के साथ किसी भी शब्द को छोड़ देते हैं; "Example.com" और "del.icio.us" लोअरकेस बने रहेंगे।

  • उनके पास विशेष रूप से विषम मामलों से निपटने के लिए हार्ड-कोडेड हैक्स हैं, जैसे "एटी एंड टी" और "क्यू एंड ए", दोनों में छोटे शब्द (पर और ए) होते हैं जो सामान्य रूप से लोअरकेस होना चाहिए।

  • शीर्षक का पहला और अंतिम शब्द हमेशा पूंजीकृत होता है, इसलिए "कुछ भी नहीं डरने वाला" जैसे इनपुट को "नथिंग टू बी अफेयर" में बदल दिया जाएगा।

  • एक बृहदान्त्र के बाद एक छोटा शब्द पूंजीकृत किया जाएगा।

आप इसे यहाँ डाउनलोड कर सकते हैं


4
capitalize (word)

यह करना चाहिए। मैं इसे अलग तरह से प्राप्त करता हूं।

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

ठीक है जैसा कि ऊपर उत्तर में कहा गया है, आपको एक कस्टम कैपिटल बनाना होगा:

mytext = 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 हूँ" चाहते हैं
yassin

@ यिसन एजबाखे: मेरे जवाब का संपादन किया, यह आपके लिए काम करना चाहिए। लेखों की सूची को किसी भी शब्दकोश से आसानी से उठाया जा सकता है
pyfunc

2

पायथन 2.7 की शीर्षक विधि में इसका दोष है।

value.title()

बढ़ई 'वापस आ जाएगी एस सहायक जब मूल्य बढ़ई है' s सहायक

सबसे अच्छा समाधान शायद स्टुअर्ट कॉलविल से शीर्षक का उपयोग करके @BioGeek से एक है। जो @Etienne द्वारा प्रस्तावित एक ही समाधान है।


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.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.