【问题标题】:Python - replacing lower case lettersPython - 替换小写字母
【发布时间】:2011-12-18 05:33:12
【问题描述】:
>>> import string
>>> word = "hello."
>>> word2 = word.replace(string.lowercase, '.')
>>> print word2
hello.

我只想把所有的小写字母变成句号。

我在这里做错了什么?

【问题讨论】:

    标签: python string replace lowercase


    【解决方案1】:

    使用regular expression:

    from re import sub
    
    print sub("[a-z]", '.', "hello.")
    

    str.replace 正在查找字符串 abcdefghijklmnopqrstuvwxyz 以将其替换为 .,而不是查找要替换的每个单独的字母。

    【讨论】:

      【解决方案2】:

      我不认为你可以使用 r*eplace* 来进行这样的映射,但你可以用一个简单的正则表达式来做你想做的事:

      >>> import re
      >>> word = 'hello.'
      >>> # the pattern you want to match
      >>> ptn = r'[a-z]'
      >>> # compile the pattern
      >>> pat_obj = re.compile(ptn)
      >>> # use the "sub" method to replace text based on a pattern
      >>> w2 = pat_obj.sub(".", word)
      >>> w2
        '......'
      

      【讨论】:

      • 他特意说的是小写字母,所以\w不符合要求。
      【解决方案3】:

      string.lowercase 是 'abcdefghijklmnopqrstuvwxyz'。您的代码正在用句号替换整个 26 字母字符串的每一次出现。

      相反,您想使用re 模块的sub 函数:

      import re
      
      word = "hello."
      word2 = re.sub('[a-z]', '.', word)
      
      print word2
      

      【讨论】:

        【解决方案4】:

        您正在尝试替换字符串“abc...xyz”,而不是替换每个小写字母。 您可以通过以下几种方式达到想要的结果:

        正则表达式

        from re import sub
        sub("[a-z]", '.', "hello.")
        

        逐个字符

        "".join('.' if l.islower() else l for l in word)
        

        【讨论】:

          【解决方案5】:

          你应该使用string.translate():

          >>> import string
          >>> input = 'abcABCaAbBcC'
          >>> input.translate(string.maketrans(string.lowercase, '.'*26))
          '...ABC.A.B.C'
          

          string.maketrans() 函数是一个有助于构建适合string.translate() 函数的映射的函数。

          或者,您可以使用生成器简单地遍历字符串:

          >>> str.join('', ('.' if chr.islower() else chr for chr in input))
          '...ABC.A.B.C'
          

          【讨论】:

          • 惯用的就是''.join('.' if chr.islower() else chr for chr in input)。
          • @agf: 是的,但我总觉得''.join(...) 读反了。所以我总是使用str.join('', ...)。
          猜你喜欢
          • 2014-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 1970-01-01
          • 2019-06-06
          相关资源
          最近更新 更多