【问题标题】:Split string into tuple (Upper,lower) 'ABCDefgh' . Python 2.7.6将字符串拆分为元组 (Upper,lower) 'ABCDefgh' 。 Python 2.7.6
【发布时间】:2014-01-09 23:17:35
【问题描述】:
my_string = 'ABCDefgh'
desired = ('ABCD','efgh')

我能想到的唯一方法是创建一个 for 循环,然后逐个扫描并检查字符串中的每个元素,然后添加到字符串中,然后创建元组。 . .有没有更有效的方法来做到这一点?

它将始终采用 UPPERlower 格式

【问题讨论】:

    标签: python split uppercase lowercase


    【解决方案1】:
    print re.split("([A-Z]+)",my_string)[1:]
    

    【讨论】:

    • 这就是我想要的!我知道有这样的事情
    • 如果它不是您描述的“ABCdefGHI”形式,它将无法工作,例如可能不会给您预期的结果
    • 当我打印这个时,我得到 3 个值;即['', 'ABCD', 'efg'] 为什么开头有一个空字符串?
    • 我修复了它...因为它在大写字母上拆分...并且在大写字母之前有一个空字符串
    【解决方案2】:

    简单方式(两遍):

    >>> 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')
    

    【讨论】:

      【解决方案3】:

      因为我把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'会有问题
      • @inspectorG4dget:是否有问题取决于 OP 的期望。我错过了一个摆动案例的例子吗?
      • 好点。我像有时一样把问题复杂化了
      【解决方案4】:
      my_string='ABCDefg'
      import re
      desired = (re.search('[A-Z]+',my_string).group(0),re.search('[a-z]+',my_string).group(0))
      print desired
      

      【讨论】:

        【解决方案5】:

        不使用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 函数稍后再打电话。

        【讨论】:

          猜你喜欢
          • 2013-02-04
          • 1970-01-01
          • 1970-01-01
          • 2020-09-06
          • 2011-07-12
          • 1970-01-01
          • 2018-10-06
          • 2017-11-07
          • 2012-02-22
          相关资源
          最近更新 更多