2016-04-23 37 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