my_string = 'ABCDefgh'
desired = ('ABCD','efgh')
我能想到的唯一方法是創建一個for循環,然後掃描並單獨檢查字符串中的每個元素,然後添加到字符串,然後創建元組。 。 。有沒有更有效的方法來做到這一點?將字符串拆分爲元組(上,下)'ABCDefgh'。 Python 2.7.6
它總是會在格式UPPERlower
my_string = 'ABCDefgh'
desired = ('ABCD','efgh')
我能想到的唯一方法是創建一個for循環,然後掃描並單獨檢查字符串中的每個元素,然後添加到字符串,然後創建元組。 。 。有沒有更有效的方法來做到這一點?將字符串拆分爲元組(上,下)'ABCDefgh'。 Python 2.7.6
它總是會在格式UPPERlower
print re.split("([A-Z]+)",my_string)[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')
my_string='ABCDefg'
import re
desired = (re.search('[A-Z]+',my_string).group(0),re.search('[a-z]+',my_string).group(0))
print desired
因爲我把一切都扔到itertools.groupby
:
>>> my_string = 'ABCDefgh'
>>> from itertools import groupby
>>> [''.join(g) for k,g in groupby(my_string, str.isupper)]
['ABCD', 'efgh']
(A這裏一點制服,但很好地擴展到更復雜的問題。)
如果'my_string ='ABCDefGHI'' – inspectorG4dget
@ inspectorG4dget會有問題:是否會有問題取決於根據OP的預期。我有沒有錯過振盪情況的例子? – DSM
不,他明確表示它將始終是UPPERlower –
一個更可靠的方法,而無需使用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次函數調用時突然出現錯誤,這可能會很有用。
這就是我一直在尋找!我知道有這樣的事情 –
它不會工作,如果它不是你描述的形式「ABCdefGHI」,可能不會給你預期的結果,例如 –
當我打印這個我得到3個值;即['','ABCD','efg']爲什麼在開始時有一個空字符串? –