2013-12-10 65 views
2

我想要你的意見,因爲你可能對Python更有經驗,因爲我也是這樣。Python:得到兩個大寫字母之間的字符串

我來自C++,我仍然不習慣Pythonic的做法。 我想循環下一個字符串,2個大寫字母之間。例如,我能做到這一點是這樣的:

i = 0 
str = "PythonIsFun" 
for i, z in enumerate(str): 
    if(z.isupper()): 
     small = '' 
     x = i + 1 
     while(not str[x].isupper()): 
      small += str[x] 

我寫這我的手機上,所以我不知道是否這甚至工作,但你抓住的想法,我相信。 我需要你幫助我在這方面獲得最好的結果,而不僅僅是以非強制的方式訪問cpu,但也需要乾淨的代碼。非常感謝您

+0

while循環,它的無盡這將產生一個無限循環 – yuvi

+0

看過去。或許,你應該在發佈關於SO的問題之前到達你的電腦? – alko

+0

只是爲了檢查,像「PythonIsFun」這樣的輸入,你在尋找一個像「ythonsun」或其他的輸出嗎?這不是很清楚。 – emh

回答

0

您可以使用列表理解輕鬆完成此操作。

>>> s = "PythonIsFun" 
>>> u = [i for i,x in enumerate(s) if x.isupper()] 
>>> s[u[0]+1:u[1]] 
'ython' 

如果你不能保證有兩個大寫字母,您可以檢查的u的長度,以確保它至少爲2。這不遍歷整個字符串,它可能是,如果一個問題兩個大寫字符出現在一個很長的字符串的開頭。

4

這是當正則表達式是最好的賭注之一。

(不要叫串str,順便說一句:它屏蔽了該內置功能。)

s = 'PythonIsFun' 
result = re.search('[A-Z]([a-z]+)[A-Z]', s) 
if result is not None: 
    print result.groups()[0] 
2

,你可以使用正則表達式:

import re 
re.findall (r'[A-Z]([^A-Z]+)[A-Z]', txt) 

輸出['ython'],和

re.findall (r'(?=[A-Z]([^A-Z]+)[A-Z])', txt) 

輸出['ython', 's'];如果你只是需要第一場比賽,

re.search (r'[A-Z]([^A-Z]+)[A-Z]', txt).group(1) 
0

有很多方法來解決這個問題,但我會使用正則表達式。

這個例子將採取 「PythonIsFun」 回報 「的ythonsun」

import re 

text = "PythonIsFun" 

pattern = re.compile(r'[a-z]')  #look for all lower-case characters 

matches = re.findall(pattern, text) #returns a list of lower-chase characters 

lower_string = ''.join(matches)  #turns the list into a string 

print lower_string 

輸出:

ythonsun 
相關問題