【问题标题】:Use .title() method without converting to lowercase使用 .title() 方法而不转换为小写
【发布时间】:2021-08-28 20:32:20
【问题描述】:

这是一个非常简单的问题,例如我需要在 Python 中将字符串 luis XIV de francia 转换为 Luis XIV De Francia。但是,如果我像这样使用.title() 方法:

'luis XIV de francia'.title()

结果是Luis Xiv De Francia。我不想让XIV 变成Xiv

所以问题是:是否有类似.title() 但不会将其他字符(不是单词的第一个字母)转换为小写的东西?

感谢您的帮助。

【问题讨论】:

  • 您可以简单地制作一个 lambda 函数,使其仅高于第一个以满足您的需要。比如:" ".join(map(lambda x:x[0].upper()+x[1:], 'luis XIV de francia'.split('')))
  • 嗨,我想也许有一个不需要创建自定义函数的解决方案,但这似乎可行,非常感谢!
  • luis XIV de frANCIA 的结果应该是什么?

标签: python string methods


【解决方案1】:

您可以使用regular expressions 查找任何单词的第一个字母和upper() 它:

import re
def custom_title(s):
    re.sub(r"(?:(?<=\W)|^)\w(?=\w)", lambda x: x.group(0).upper())

custom_title('luis XIV de francia')
# > 'Luis XIV De Francia'

regex's sub 方法适用于带有标点的较大字符串。

custom_title('luis XIV de francia, something. foo-bar')
# > 'Luis XIV De Francia, Something. Foo-Bar'

这是另一个将单字母单词大写的版本:

def custom_title(s):
    return re.sub(r"(?:(?<=\W)|^)\w", lambda x: x.group(0).upper(), s)

【讨论】:

    【解决方案2】:

    title() 方法不知道 'xiv' 是罗马数字。你能做的最好的就是分割你的字符串,然后title()相关的部分,让XIV部分保持原样,然后将这些部分连接在一起。我认为程序不会意识到一组字符可能是罗马数字。

    def title_except_all_caps(input):
        parts = [p.title() if p.islower() else p for p in input.split()]
        return ' '.join(parts)
    

    虽然解释中谈到了罗马数字,但我希望您了解这里发生了什么。这会在空格之间拆分原始字符串,然后如果它是小写字符串,则对其应用title()。如果没有,请不要理会它。最后,通过使用空格作为连接符连接各个部分来组装生成的字符串。

    【讨论】:

    • 感谢您的回答!但是我不需要程序来识别罗马数字,我需要一些东西,例如将“foo foo BAR”变成“Foo Foo BAR”而不是“Foo Foo Bar”。
    • 我的代码所做的就是不理会所有大写的段。它与罗马数字无关。
    • 是的,你是对的,但它不适用于“foo foo bAr”。
    • 不,它不会 -- 但是因为 'bAr' 不是全部大写,它会变成 Bar。在您最初的问题陈述中,您不清楚为什么 XIV 很特别,所以我最初认为它是罗马数字,但后来认为如果您希望它保持全部大写,它应该全部大写。这就是我提供的解决方案。
    • 换一种说法,如果您将其设为标题大小写的标准是全部小写,那么只需替换not p.isupper()`` with p.islower()`,这可能更像您的想法。您确实尝试了示例代码,对吗?
    猜你喜欢
    • 2013-04-21
    • 2018-08-17
    • 2011-04-12
    • 2018-02-07
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多