views:

800

answers:

4

This is good:

import string string.capwords("proper name") 'Proper Name'

This is not so good:

string.capwords("I.R.S") 'I.r.s'

Is there no string method to do capwords so that it accomodates acronyms?

+2  A: 

No, there is no such method in the standard library.

Martin v. Löwis
+1  A: 

Even if there were such a function, what would it do when asked to process "IRS"? Even the IRS call themselves "IRS" with no dots.

Greg Hewgill
But for my purposes, using periods/dots is a way of saying that I want each of the letters to be capitalized.
jamtoday
+4  A: 

This might work:

import re

def _callback(match):
    """ This is a simple callback function for the regular expression which is 
        in charge of doing the actual capitalization. It is designed to only 
        capitalize words which aren't fully uppercased (like acronyms).
    """
    word = match.group(0)
    if word == word.upper():
        return word
    else:
        return word.capitalize()

def capwords(data):
    """ This function converts `data` into a capitalized version of itself. This 
        function accomidates acronyms.
    """
    return re.sub("[\w\'\-\_]+", _callback, data)

Here is a test:

print capwords("This is an IRS test.")    # Produces: "This Is An IRS Test."
print capwords("This is an I.R.S. test.") # Produces: "This Is An I.R.S. Test."
Evan Fosmark
A: 

I just used a list comprehension: [ ".".join( [ string.capwords(l) for l in entry.split(".") ] ) for entry in original_list ]

jamtoday