2016-04-23 29 views
0

我正在寻找一种更健壮的方式来转换下面的字符串。我想找到3个单词的前3个字母并改变大小写。单词可以是任何东西,现在我只是使用字符串替换每个小写字母。python正则表达式case change

s1 = 'hello.crazy.world.txt' 

s1 = s1.replace('h','H') 
+1

用点分隔的所有的话吗?不要使用'str'作为变量。你正在隐藏内置的'str',并且肯定会遇到使用实际的'str'对象的问题。 – idjaw

+0

'split('。')'和'title()'是使用的好方法 –

+0

是的,全部用点分开。关于var名称的好点,我改变了它。 – iheartcpp

回答

5

str.title大写的连续的字母组 - 你只需要排除的扩展。要做到这一点

方式一:

In [5]: name, ext = s.rsplit('.', 1) 

In [6]: '{}.{}'.format(name.title(), ext) 
Out[6]: 'Hello.Crazy.World.txt' 
+2

'rsplit'似乎是一个很好的解决方案 - 不知道那 – tobspr

+0

我喜欢这个解决方案,但究竟是什么'{}。{}'在做? – iheartcpp

+1

@iheartcpp:连接'name.title()',''。''和'ext' https://docs.python.org/3/library/string.html#formatstrings – vaultah

1

你可以使用str.capitalize

s1 = 'hello.crazy.world.txt' 
out = '.'.join([i.capitalize() for i in s1.split('.')]) 

这所有大写的第一个字母,生产'Hello.Crazy.World.Txt'

如果您只想为前三个单词执行此操作,则可以使用切片,然后附加扩展名。

s1 = 'hello.crazy.world.txt' 
split = s1.split('.') 
extension = split[-1] 
capitalized = [i.capitalize() for i in split[:-1]] 
capitalized.append(extension) 
out = '.'.join(capitalized) 

这产生了'Hello.Crazy.World.txt'

如果你有一个你不喜欢大写的项目,你可以省略该项目(比如本例中的最后一个项目),那么使用大写字母就是title。

一个更紧凑的方式将使用列表理解来把握每一个项目,与最后一个项目外,合并列表和在一个单一的步骤:

s1 = 'hello.crazy.world.txt' 
split = s1.split('.') 
out = '.'.join([i.capitalize() for i in split[:-1]] + [split[-1]]) 
1

最简单的解决方案加入了结果字符串使用.title伪():

>>> "hello.crazy.world.txt".title() 
"Hello.Crazy.World.Txt" 

既然你不想利用最后一部分,你会怎么做:

parts = "hello.crazy.world.txt".split(".") 
result = '.'.join(parts[:-1]).title() + "." + parts[-1] 
+0

我知道,编辑答案,你比我打字时要快:) – tobspr

0

虽然你的问题是在这暧昧的,我想你想是这样的:

import os 
st_filename = 'hello.crazy.world.txt' 
st_base, st_ext = os.path.splitext(st_filename) 
st_base = st_base.title() 
st_filename = ''.join(st_base, st_ext) 
# I am unsure if the splitext will work across platforms to be rejoined with join, but it seems to work on linux and Mac OS X