string.title()认为撇号是一个新单词的开头。为什么?

时间:2011-10-16 19:54:38

标签: python string title

>>> myStr="madam. i'm adam! i also tried c,o,m,m,a"
>>> myStr.title()
"Madam. I'M Adam! I Also Tried C,O,M,M,A"

这当然是不正确的。为什么将撇号视为新词的开头。这是一个问题还是我对 title 的概念做错了?

4 个答案:

答案 0 :(得分:5)

因为实现通过查看前一个字符来工作,并且如果它是字母数字,它会使当前字符更小,否则它就是大写字母。也就是说,它相对简单,这就是它的纯python版本:

def title(string):
    result = []
    prev_letter = ' '

    for ch in string:
        if not prev_letter.isalpha():
            result.append(ch.upper())
        else:
            result.append(ch.lower())

        prev_letter = ch

    return "".join(result)

答案 1 :(得分:3)

您可以使用:

string.capwords()

# Capitalize the words in a string, e.g. " aBc  dEf " -> "Abc Def".
def capwords(s, sep=None):
    """capwords(s, [sep]) -> string

    Split the argument into words using split, capitalize each
    word using capitalize, and join the capitalized words using
    join. Note that this replaces runs of whitespace characters by
    a single space.

    """
    return (sep or ' ').join(x.capitalize() for x in s.split(sep))

而且,由于title()依赖于语言环境,请检查您的语言环境以查看这是否是故意的:

  

locale.localeconv()
  以a为单位返回本地约定的数据库   字典。

     

title()
  返回一个标题的字符串版本:单词开头   大写字符,所有剩余的套接字符都是小写字母。对于8位字符串,此方法取决于区域设置。

答案 2 :(得分:2)

  

标题方法将字符串中每个单词的第一个字母大写(并使其余的小写)。单词被标识为由非字母字符分隔的字母字符的子字符串,例如数字或空格。这可能会导致一些意外行为。例如,字符串“x1x”将转换为“X1X”而不是“X1x”。

http://en.wikibooks.org/wiki/Python_Programming/Strings#title.2C_upper.2C_lower.2C_swapcase.2C_capitalize

基本上,按预期工作。由于撇号确实是非字母的,因此您可以获得上面概述的“意外行为”。

一些谷歌搜索显示,其他人认为这不是最好的事情,并且已经编写了替代实现。请参阅:http://muffinresearch.co.uk/archives/2008/05/27/titlecasepy-titlecase-in-python/

答案 3 :(得分:2)

这里的问题是“标题案例”是一个非常依赖文化的概念。即使是英语,也有太多的角落案例适合他们。 (另见http://bugs.python.org/issue7008

如果你想要更好的东西,你需要考虑你想要处理的文本类型(这意味着不正确地做其他文本),并编写自己的函数。