【问题标题】:How to capitalize first character of each word in a string?如何将字符串中每个单词的第一个字符大写?
【发布时间】:2018-03-31 15:45:59
【问题描述】:

我遇到了一个问题陈述,我必须将句子中的第一个字符和后面单词的后续字符大写。我想出了一个使用正则表达式的解决方案,但我不得不使用两个正则表达式来完成工作。

有没有办法将这两个正则表达式组合成一个?

import re
def capitalize(string):
    l2 = re.findall(r'([^\d][a-zA-Z]+\w*)', string) # reg exp1 
    l4 = re.findall(r'(^[a-zA-Z]+\w*)', string) # reg exp2 
    #  Is there a way of combining these? 
    if l4 not in l2:
        l2.extend(l4)
    l3 = {e: e.title() for e in l2}
    newstring = string
    for item in l3:
        newstring = newstring.replace(item, l3[item])
    return newstring


validatorvalue = 'q w e r  G H J  K  M' # => o/p  'Q W E R  G H J  K  M'
# validatorvalue = 'hello   world  lol' => o/p  'Hello   World  Lol'
# validatorvalue = "1 w 2 r 3g"   => "1 W 2 R 3g"
print(capitalize(validatorvalue))

我必须坚持使用这两个正则表达式,因为这是上述 2 个测试用例通过标准的唯一方法。

【问题讨论】:

标签: python regex string python-3.x


【解决方案1】:

你可以得到相同的结果不使用regex。 Python 有str.title(),它也有同样的作用。例如:

>>> 'q w e r  G H J  K  M'.title()
'Q W E R  G H J  K  M'

>>> 'Hello   world  lol'.title()
'Hello   World  Lol'

>>> '1 w 2 r 3g'.title()
'1 W 2 R 3G'

或者您可以使用string.capwords() 执行类似的操作。例如:

>>> import string

>>> string.capwords('q w e r  G H J  K  M')
'Q W E R G H J K M'       # ^^ Multiple white space was replaced with single space 

>>> string.capwords('Hello   world  lol')
'Hello World Lol'

>>> string.capwords('1 w 2 r 3g')
'1 W 2 R 3g'

注意:string.capwords()文档中所述:

如果可选的第二个参数 sep 不存在或无,则空白字符的运行将替换为单个空格并删除前导和尾随空格,否则 sep 用于拆分和连接单词。


作为替代方案,您可以编写自定义函数,首先根据空格拆分字符串以获取单词列表,然后使用str.capitalize() 将每个单词大写,最后加入您的列表以获得所需的字符串。这是一个示例:

def convert_string(my_str):
    return ' '.join(s.capitalize() for s in my_str.split())

示例运行:

>>> convert_string('Q w e r  g h j  k  m')
'Q W E R G H J K M'
>>> convert_string('Hello   world  lol')
'Hello World Lol'
>>> convert_string('1 w 2 r 3g')
'1 W 2 R 3g'

【讨论】:

  • 这也很整洁!谢谢,
【解决方案2】:

title 方法可以做到这一点。

>>> my_string='hello world i need some capital letters'
>>> my_string.title()
'Hello World I Need Some Capital Letters'

【讨论】:

    【解决方案3】:

    要将句子中的所有单词大写,可以使用re.subre.findall

    import re
    def capitalize_string(s):
      return re.sub('(?<=^)[a-z]|(?<=\s)[a-z]', '{}', s).format(*map(str.upper, re.findall('(?<=^)[a-z]|(?<=\s)[a-z]', s)))
    
    strings = ['q w e r  G H J  K  M', 'hello   world  lol', "1 w 2 r 3g"]
    result = list(map(capitalize_string, strings))
    

    输出:

    ['Q W E R  G H J  K  M', 'Hello   World  Lol', '1 W 2 R 3g']
    

    【讨论】:

    • @Abhishek (?&lt;=^) 是一个正向的lookbehind,这意味着下面的模式,在这种情况下是[a-z],只有当[a-z]出现在字符串的开头时才会匹配输入。
    • @Ajax1234 (?&lt;=^)^ 有什么区别?
    • 在这种情况下,您正在检查两个条件 (?
    • @Abhishek 这是正确的。 | 将尝试匹配任一表达式。
    • @Ajax1234 非常感谢!
    【解决方案4】:

    您可以使用Moinuddin's non-regex solution,以防您想将空格分隔的“单词”大写。

    如果有单词粘在标点上并且它们也需要大写,您可以使用

    re.sub(r'\b[a-z]', lambda x: x.group().upper(), validatorvalue)
    

    请参阅Python online demo\b 匹配单词边界,[a-z] 匹配小写 ASCII 字母。

    或者,将其扩展到所有 Unicode 字母,

    re.sub(r'\b[^\W\d_]', lambda x: x.group().upper(), validatorvalue)
    

    在 Python 2 中,您需要传递 re.U 修饰符以使 \W\d 速记字符类可识别 Unicode。

    【讨论】:

      猜你喜欢
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2016-03-17
      • 2020-09-29
      相关资源
      最近更新 更多