如何大写字符串中每个单词的第一个字符?

时间:2018-03-31 15:46:00

标签: python regex string python-3.x

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

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

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个测试用例通过标准的唯一方法。

4 个答案:

答案 0 :(得分:6)

您可以在不使用regex 的情况下获得相同的结果。 Python有string.capwords()也是如此。例如:

>>> import string

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

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

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

作为替代方案,您可以编写自定义函数,首先根据空格分割字符串以获取单词列表,然后使用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'

答案 1 :(得分: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']

答案 2 :(得分:1)

如果您想要将空格分隔的“单词”大写,可以使用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感知能力。

答案 3 :(得分:1)

title方法可以做到这一点。

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