2014-01-09 31 views

回答

1
print re.split("([A-Z]+)",my_string)[1:] 
+0

這就是我一直在尋找!我知道有這樣的事情 –

+0

它不會工作,如果它不是你描述的形式「ABCdefGHI」,可能不會給你預期的結果,例如 –

+0

當我打印這個我得到3個值;即['','ABCD','efg']爲什麼在開始時有一個空字符串? –

1

簡單的方式(兩遍):

>>> import itertools 
>>> my_string = 'ABCDefgh' 
>>> desired = (''.join(itertools.takewhile(lambda c:c.isupper(), my_string)), ''.join(itertools.dropwhile(lambda c:c.isupper(), my_string))) 
>>> desired 
('ABCD', 'efgh') 

高效的方式(一個通):

>>> my_string = 'ABCDefgh' 
>>> uppers = [] 
>>> done = False 
>>> i = 0 
>>> while not done: 
...  c = my_string[i] 
...  if c.isupper(): 
...   uppers.append(c) 
...   i += 1 
...  else: 
...   done = True 
... 
>>> lowers = my_string[i:] 
>>> desired = (''.join(uppers), lowers) 
>>> desired 
('ABCD', 'efgh') 
0
my_string='ABCDefg' 
import re 
desired = (re.search('[A-Z]+',my_string).group(0),re.search('[a-z]+',my_string).group(0)) 
print desired 
1

因爲我把一切都扔到itertools.groupby

>>> my_string = 'ABCDefgh' 
>>> from itertools import groupby 
>>> [''.join(g) for k,g in groupby(my_string, str.isupper)] 
['ABCD', 'efgh'] 

(A這裏一點制服,但很好地擴展到更復雜的問題。)

+0

如果'my_string ='ABCDefGHI'' – inspectorG4dget

+1

@ inspectorG4dget會有問題:是否會有問題取決於根據OP的預期。我有沒有錯過振盪情況的例子? – DSM

+0

不,他明確表示它將始終是UPPERlower –

0

一個更可靠的方法,而無需使用re

import string 

>>> txt = "ABCeUiioualfjNLkdD" 
>>> tup = (''.join([char for char in txt if char in string.ascii_uppercase]), 
    ''.join([char for char in txt if char not in string.ascii_uppercase])) 

>>> tup 
('ABCUNLD', 'eiioualfjkd') 

char not in string.ascii_uppercase代替char in string.ascii_lowercase意味着你」如果你的字符串中沒有字母,那麼你永遠不會丟失任何數據,如果你以後在這個輸入開始被拒絕20次函數調用時突然出現錯誤,這可能會很有用。