string.title () считает апостроф новым началом слова. Зачем? - PullRequest
3 голосов
/ 16 октября 2011
>>> 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 ]

5 голосов
/ 16 октября 2011

Поскольку реализация работает, просматривая предыдущий символ, и, если он буквенно-цифровой, он строчными буквами текущего символа, в противном случае заглавными.То есть, это относительно просто, вот как выглядит версия на чистом 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)
3 голосов
/ 16 октября 2011

Вы можете использовать:

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()Возвращает базу данных местных соглашений в виде словаря.

title()Возвращает заглавную версию строки: слова начинаются с заглавных букв, все остальные заглавные буквы строчными.Для 8-битных строк этот метод зависит от локали.

2 голосов
/ 17 октября 2011

Проблема здесь в том, что «заглавие» является очень культурно-зависимым понятием. Даже на английском языке слишком много угловых случаев, чтобы вместить их всех. (См. Также http://bugs.python.org/issue7008)

Если вы хотите что-то лучше, вам нужно подумать о том, какие тексты вы хотите обрабатывать (а это означает, что вы делаете другие неправильно), и написать свою собственную функцию.

2 голосов
/ 16 октября 2011

Метод title использует первую букву каждого слова в строке (а остальные строчные). Слова идентифицируются как подстроки буквенных символов, которые разделены не алфавитными символами, такими как цифры или пробел. Это может привести к неожиданному поведению. Например, строка «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/

...