【发布时间】:2014-01-09 23:17:35
【问题描述】:
my_string = 'ABCDefgh'
desired = ('ABCD','efgh')
我能想到的唯一方法是创建一个 for 循环,然后逐个扫描并检查字符串中的每个元素,然后添加到字符串中,然后创建元组。 . .有没有更有效的方法来做到这一点?
它将始终采用 UPPERlower 格式
【问题讨论】:
标签: python split uppercase lowercase
my_string = 'ABCDefgh'
desired = ('ABCD','efgh')
我能想到的唯一方法是创建一个 for 循环,然后逐个扫描并检查字符串中的每个元素,然后添加到字符串中,然后创建元组。 . .有没有更有效的方法来做到这一点?
它将始终采用 UPPERlower 格式
【问题讨论】:
标签: python split uppercase lowercase
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')
【讨论】:
因为我把itertools.groupby 扔在任何东西上:
>>> my_string = 'ABCDefgh'
>>> from itertools import groupby
>>> [''.join(g) for k,g in groupby(my_string, str.isupper)]
['ABCD', 'efgh']
(这里有点过分,但可以很好地扩展到更复杂的问题。)
【讨论】:
my_string = 'ABCDefGHI'会有问题
my_string='ABCDefg'
import re
desired = (re.search('[A-Z]+',my_string).group(0),re.search('[a-z]+',my_string).group(0))
print desired
【讨论】:
不使用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 函数稍后再打电话。
【讨论】: