my_string = 'ABCDefgh'
desired = ('ABCD','efgh')
我能想到这样做的唯一方法是创建一个for循环,然后单独扫描并检查字符串中的每个元素,然后添加到字符串然后创建元组。 。 。有没有更有效的方法来做到这一点?
它将始终采用UPPERlower格式
答案 0 :(得分: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')
答案 1 :(得分:1)
print re.split("([A-Z]+)",my_string)[1:]
答案 2 :(得分:1)
因为我向所有事情投掷itertools.groupby
:
>>> my_string = 'ABCDefgh'
>>> from itertools import groupby
>>> [''.join(g) for k,g in groupby(my_string, str.isupper)]
['ABCD', 'efgh']
(这里有点制服,但很好地扩展到更复杂的问题。)
答案 3 :(得分: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
答案 4 :(得分: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个函数调用。