2010-09-16 18 views
62

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

उत्तर

116

इसके साथ कुछ समस्याएं हैं। यदि आप विभाजन और जुड़ने का उपयोग करते हैं, तो कुछ सफेद स्पेस वर्णों को अनदेखा कर दिया जाएगा। अंतर्निहित पूंजीकरण और शीर्षक विधियां सफेद स्थान को अनदेखा नहीं करती हैं।

>>> '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 
+5

+1 "एक लेख से शुरू होने वाली वाक्य" केस – yassin

+0

क्यों 'पुनः' आवश्यक है? एक '" ".plit' फ़ंक्शन है जो वही करता है। – wizzwizz4

+0

@ wizzwizz4: 'str.split' संगत रिक्त स्थान पर विचार नहीं करता है। 're.split' रिक्त स्थान बरकरार रखता है। तो, यह समारोह किसी भी जगह नहीं खाता है। – dheerosaur

14

इन तरीकों के होते हैं:

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

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

+0

titlecase.py लोअरकेस लेखों के एक सेपरेटर के साथ सूची तत्वों में शामिल हो जाता है। –

3
capitalize (word) 

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

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

ठीक उत्तर में ऊपर कहा के रूप में, आप एक कस्टम करना है भुनाने:

mytext = u'i एक 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 
हूँ
+0

यह वही नहीं है जो मैं चाहता हूं। मैं "मैं एक फूबर बज़बर हूं" – yassin

+0

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

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 
""" 

शीर्षक टोपी के साथ शुरू होता है इटालाइज्ड शब्द और यह लेख से मेल नहीं खाता है।

40

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

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

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

+1

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

+0

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

9

a Perl script written by John Gruber की Stuart Colville has made a Python port शीर्षक मामले में तार कन्वर्ट करने के लिए लेकिन कई विशेष मामलों के लिए शैली के न्यूयॉर्क टाइम्स मैनुअल, साथ ही खानपान से नियमों के आधार पर छोटे शब्दों को बड़े अक्षरों टाल ।

इन लिपियों के चालाकी से कुछ:

  • वे जैसे छोटे शब्द फ़ायदा उठाने की है, में, की, पर, आदि, लेकिन उन्हें अन-भुनाने होगा अगर वे ग़लती से में पूंजीकृत कर रहे हैं इनपुट।

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

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

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

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

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

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

3

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

value.title() 

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

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

0

एक-लाइनर सूची समझ और त्रिगुट ऑपरेटर का उपयोग

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(" ") विभाजन एक सूची में स्ट्रिंग और शुरू की पाश के लिए (सूची comprehenstion में) एक

word.title() if word not in "the a on in of an" else word मूल विधि title() शीर्षक शीर्षक के लिए स्ट्रिंग का उपयोग करता है यदि यह कोई आलेख नहीं है

" ".join (स्पेस)

संबंधित मुद्दे