【问题标题】:How to extract all UPPER from a string? Python如何从字符串中提取所有 UPPER? Python
【发布时间】:2013-03-30 23:05:42
【问题描述】:
#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'

如何从字符串中提取所有的 UPPER?

#output
my_upper = 'ABCDEFGHIJKLMNOP'

【问题讨论】:

  • 你能告诉我们你到目前为止所做的尝试吗?
  • 我找到了一种使用 for 循环的方法,但它似乎效率不高
  • 请务必在问题中提供;您面临什么样的效率限制还很不明显
  • 我仍然习惯了 join 功能,但我知道它会是这样的
  • 当你说“它似乎没有效率”时,你是什么意思?你测试了它,它太慢了?您怀疑应该是线性的某处存在一些二次行为?还是……?

标签: python string extract uppercase lowercase


【解决方案1】:
for char in my_string:
     if char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
         print(char)

【讨论】:

    【解决方案2】:

    给你:

    my_string = 'abcdefgABCDEFGHIJKLMNOP'
    
    cleanChar = ''
    
    for char in my_string:
        if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
            cleanChar = cleanChar + char
    
    newChar = cleanChar
    print(" {}".format(newChar))
    

    【讨论】:

      【解决方案3】:

      你可以使用更实用的方法

      >>> s = 'abcdefgABCDEFGHIJKLMNOP'
      >>> filter(str.isupper, s)
      'ABCDEFGHIJKLMNOP'
      

      【讨论】:

      • filter(str.isupper,"abvABC") lambdas 减慢过滤器的速度...尽可能使用内置函数:)
      • 你需要一个join 这里。否则,您将返回 list (2.x) 或过滤器迭代器 (3.x),而不是字符串。
      • 另外,将filter 称为“功能性更强”而不是理解/基因表达有点误导,至少没有解释。毕竟,Python 借用后者的语言是 Haskell。
      【解决方案4】:
      import string
      s = 'abcdefgABCDEFGHIJKLMNOP'
      s.translate(None,string.ascii_lowercase)
      

      string.translate(s, table[, deletechars]) 函数将从字符串中删除 deletechars 中的所有字符,这是一个字符列表。然后,字符串将使用表进行翻译(在这种情况下我们没有使用它)

      要仅删除小写字母,您需要传递string.ascii_lowercase 作为要删除的字母列表。

      table 为 None,因为当表为None 时,只会执行字符删除步骤。

      【讨论】:

      • 我想发这个,但最终在太多情况下都失败了(标点符号、非打印字符等)
      • 当数据只是字母时,删除所有小写仅与减去所有大写相同。 OP 的一个样本全是字母,所以这可能是合适的——但并非没有解释差异。
      • 这是迄今为止所有给定方法中最省时的方法......假设它适用于 OP 用例......
      • 如果您需要处理非字母,但仍然只能处理 ASCII,您可以将ascii_nonuppercase 定义为,例如''.join(c for c in string.printable if c not in string.ascii_uppercase),或者只是'0123456789abcdefghijklmnopqrstuvwxyz!"#$%&\'()*+,-./:;<=>?@[\\]^_{|}~ \t\n \r\x0b\x0c'`,然后使用它。如果您需要处理非入门的 Unicode,但除此之外,请给 Joran Beasley 的时间安排,稍微额外的复杂性可能是值得的。
      【解决方案5】:

      或使用正则表达式...这是一个简单的答案

      import re
      print ''.join(re.findall('[A-Z]+',my_string))
      

      只是为了比较

      In [6]: %timeit filter(str.isupper,my_list)
      1000 loops, best of 3: 774 us per loop
      
      In [7]: %timeit ''.join(re.findall('[A-Z]+',my_list))
      1000 loops, best of 3: 563 us per loop
      
      In [8]: %timeit re.sub('[^A-Z]', '', my_list)
      1000 loops, best of 3: 869 us per loop
      
      In [10]: %timeit ''.join(c for c in my_list if c.isupper())
      1000 loops, best of 3: 1.05 ms per loop
      

      所以这个 join plus findall 是最快的方法(根据 ipython %timeit (python 2.6)),使用 10000 个字符长的相同字符串

      编辑:或否

      In [12]: %timeit  my_list.translate(None,string.ascii_lowercase)
      10000 loops, best of 3: 51.6 us per loop
      

      【讨论】:

      • 这将返回一个列表,而不是一个字符串,虽然
      • 您需要添加一个join 才能完成这项工作。 (如果您绝对确定所有大写字符都在一次运行中,当然可以使用[0]。)
      • fixed :P ... 只是在最后加入了输出
      • 如果没有测试多个 Python 版本、平台等以及不同的输入数据,我不会根据 10% 的差异对效率做出任何强烈的声明。例如,我使用 CPython 2.7.2 得到了类似的结果,但在 3.3.0 上,genexp 比正则表达式高 5%,而在 PyPy 1.9.0 中,filter 比它高 20%。 translate 的数量级增益更可能是值得信赖的,但在 PyPy 的快速测试中,即使这样也下降到 2:1 的增益。
      【解决方案6】:

      使用列表推导:

      >>> s = 'abcdefgABCDEFGHIJKLMNOP'
      >>> ''.join([c for c in s if c.isupper()])
      'ABCDEFGHIJKLMNOP'
      

      使用生成器表达式:

      >>> ''.join(c for c in s if c.isupper())
      'ABCDEFGHIJKLMNOP
      

      你也可以使用正则表达式:

      >>> re.sub('[^A-Z]', '', s)
      'ABCDEFGHIJKLMNOP'
      

      【讨论】:

        【解决方案7】:

        高阶函数助你一臂之力!

        filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")
        

        编辑:如果您不知道过滤器的作用:过滤器接受一个函数和一个可迭代对象,然后将该函数应用于可迭代对象中的每个元素。它保留所有返回 true 的值并丢弃所有其余的值。因此,这将返回“ABCDEFGHIJKLMNOP”。

        【讨论】:

        • 这样更好:filter(str.isupper,"abvABC")
        • 这个也需要join,因为 OP 需要一个字符串,而不是列表或过滤器迭代器。
        • 这确实返回了一个字符串。
        猜你喜欢
        • 2021-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多