2

我有以下程序:

def capitalize(self, text):
    t = ' '.join([ ''.join([w[0].upper()]+[w[1:]]) for w in text.split()])
    if text and text[-1] == ' ':
        t = ''.join([t] + [' '])
    return t

它需要一个字符串text。它应该做什么:

  • 将每个字符串组(单词)的第一个字母大写,并在文本末尾保留空格(如果有的话)。

前任:

'home swe eeeet home' -> 'Home Swe Eeeet Home'
'heLLo OoO ooo '      -> 'HeLLo OoO Ooo ' (space preserved in the end)

问题:

凭借我有限的、完全非专家级的 Python,我试图创建这个过程,以尽可能快地节省内存。

  • 在这种情况下,将事物转换为列表并将它们加入到不继续创建新字符串的方法是否有效?

  • 有没有更好,更蟒蛇的方式来实现这一点?

此外:

每次在 GUI 应用程序的文本字段上按下一个键时都会调用此过程。

4

2 回答 2

2

使用re.sub

>>> import re
>>> re.sub(r'\b[a-z]', lambda m: m.group().upper(), 'home swe eeeet home')
'Home Swe Eeeet Home'
>>> re.sub(r'\b[a-z]', lambda m: m.group().upper(), 'heLLo OoO ooo ')
'HeLLo OoO Ooo '

re.sub(模式,repl,字符串,count=0,flags=0)

返回通过替换 repl 替换 string 中最左边的不重叠出现的模式获得的字符串。如果未找到该模式,则字符串原封不动地返回。repl 可以是字符串或函数。

如果 repl 是一个函数,则每次出现不重叠的模式时都会调用它。该函数采用单个匹配对象参数,并返回替换字符串。

\b[a-z][a-z]匹配单词边界 ( ) 之后的任何小写字符 ( \b)。

lambda函数用于将字符转换为大写;MatchObject.match返回匹配组。假设没有参数组 0。组 0 表示整个匹配字符串。

于 2013-08-15T16:59:26.170 回答
0
def title(s):
    return(' '.join(x.capitalize() for x in s.split(' ')))

# Or alternatively:
#y = []
#for x in s.split(' '): 
#    y.append(x.capitalize())
#return ' '.join(y)
于 2013-08-31T13:49:37.593 回答