سؤال

هل هناك طريقة قياسية في Python لتثبيط سلسلة (أي الكلمات تبدأ بالأحرف الكبيرة ، وجميع الشخصيات المتبقية تحتوي على أحرف صغيرة) ولكن ترك مقالات مثل and, in, ، و of منخفضة؟

هل كانت مفيدة؟

المحلول

هناك بعض المشاكل مع هذا. إذا كنت تستخدم الانقسام والانضمام ، فسيتم تجاهل بعض أحرف المساحة البيضاء. لا تتجاهل أساليب الاستفادة المدمجة والعنوان المساحة البيضاء.

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

إذا بدأت الجملة بمقال ، فأنت لا تريد الكلمة الأولى للعنوان في Secorrase.

مع الأخذ في الاعتبار:

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

نصائح أخرى

استخدم ال titlecase.py وحدة! يعمل فقط للغة الإنجليزية.

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

جيثب: https://github.com/ppannuto/python-titlecase

هناك هذه الطرق:

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

لا يوجد خيار مقال صغير. يجب عليك ترميز ذلك بنفسك ، ربما باستخدام قائمة بالمقالات التي تريد تخفيضها.

قام ستيوارت كولفيل بتصنيع ميناء بيثون من سيناريو بيرل كتبه جون جروبر لتحويل الأوتار إلى حالة الملكية ولكن يتجنب الاستفادة من الكلمات الصغيرة استنادًا إلى قواعد من دليل New York Times للأناقة ، بالإضافة إلى تلبية العديد من الحالات الخاصة.

بعض ذكاء هذه البرامج النصية:

  • يستفيدون من الكلمات الصغيرة مثل إذا ، في ، على, ، وما إلى ذلك ، ولكن ستعمل عليها إذا كانت ترسمها عن طريق الخطأ في المدخلات.

  • تفترض البرامج النصية أن الكلمات ذات الحروف المرموقة بخلاف الحرف الأول يتم رسملة بالفعل بشكل صحيح. هذا يعني أنهم سيتركون كلمة مثل "iTunes" بمفردها ، بدلاً من تحويلها إلى "iTunes" أو ، "iTunes".

  • يتخطون أي كلمات مع نقاط خط. سيبقى "example.com" و "del.icio.us" أحرفًا صغيرة.

  • لديهم اختراقات متشددة على وجه التحديد للتعامل مع الحالات الفردية ، مثل "AT&T" و "Q&A" ، وكلاهما يحتوي على كلمات صغيرة (AT و A) التي يجب أن تكون عادةً صغيرة.

  • تتم دائمًا رسملة الكلمة الأولى والأخيرة من العنوان ، لذلك سيتم تحويل المدخلات مثل "لا شيء تخاف منه" إلى "لا شيء يخاف منه".

  • سيتم رسملة كلمة صغيرة بعد القولون.

يمكنك تنزيله هنا.

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

طريقة لقب Python 2.7 لها عيب فيه.

value.title()

سيعود نجارس مساعد عندما تكون القيمة نجار "س مساعد

من المحتمل أن يكون الحل الأفضل هو الحل من Biogeek باستخدام TitleCase من ستيوارت كولفيل. وهو نفس الحل الذي اقترحه Etienne.

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

يبدأ العنوان بكلمة رسمية ولا يتطابق مع المقالة.

خط واحد باستخدام فهم القائمة والمشغل الثلاثية

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(" ") يقسم السلسلة إلى قائمة ويبدأ A for Loop (في القائمة ComplayStion)

word.title() if word not in "the a on in of an" else word يستخدم الطريقة الأصلية title() لحالة العنوان السلسلة إذا لم تكن مقالة

" ".join ينضم إلى عناصر القائمة مع مقطع (فضاء)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top