【问题标题】:Using a regular expression to replace upper case repeated letters in python with a single lowercase letter使用正则表达式将python中的大写重复字母替换为单个小写字母
【发布时间】:2011-05-07 22:10:08
【问题描述】:

我试图用小写字母的单个实例替换在字符串中重复两次的大写字母的任何实例。我正在使用以下正则表达式,它能够匹配重复的大写字母,但我不确定如何将被替换的字母变为小写。

import re
s = 'start TT end'
re.sub(r'([A-Z]){2}', r"\1", s)
>>> 'start T end'

如何使“\1”小写?我不应该使用正则表达式来执行此操作吗?

【问题讨论】:

  • 不知道如何将其设为小写,但您应该使用'([A-Z]){2,}' 而不是'([A-Z]){2}' 来替换任何实例。
  • 您的正则表达式还匹配两个不同的大写字母。

标签: python regex capitalization


【解决方案1】:
def replace(s):
    return " ".join(re.findall(r"[A-Z]){2}", s)).lower()

我猜这就是你要找的。​​p>

【讨论】:

    【解决方案2】:

    警告!这篇文章没有按要求回复。继续你自己的责任!

    我不知道极端情况的可能性有多大,但这就是 Python 进行我幼稚编码的方式。

    import string
    s = 'start TT end AAA BBBBBBB'
    for c in string.uppercase:
        s = s.replace(c+c,c.lower())
    print s
    """ Output:
    start t end aA bbbB
    """
    

    【讨论】:

      【解决方案3】:

      Pass a function 作为 repl 参数。 MatchObject 被传递给这个函数,.group(1) 给出第一个带括号的子组:

      import re
      s = 'start TT end'
      callback = lambda pat: pat.group(1).lower()
      re.sub(r'([A-Z]){2}', callback, s)
      

      编辑
      是的,您应该使用([A-Z])\1 而不是([A-Z]){2}匹配例如AZ。 (参见@bobince 的answer。)

      import re
      s = 'start TT end'
      re.sub(r'([A-Z])\1', lambda pat: pat.group(1).lower(), s) # Inline
      

      给予:

      'start t end'
      

      【讨论】:

        【解决方案4】:

        试试这个:

        def tol(m):
           return m.group(0)[0].lower()
        
        s = 'start TTT AAA end'
        re.sub(r'([A-Z]){2,}', tol, s)
        

        请注意,这不会替换单个大写字母。如果你想这样做,请使用r'([A-Z]){1,}'

        【讨论】:

        • OP 说:重复两次
        • @SilentGhost。我的错。如果不应该触摸单个大写字符,则 re 应该按照 Ignacio 的建议。
        • 如果您查看 bobince 和 jens 的答案,您会看到更短的方法。
        • 我明白了,谢谢。关于单个大写字符的问题仍然悬而未决。
        【解决方案5】:

        标识替换的 'repl' 参数可以是字符串(如您在此处使用的那样)或函数。这将满足您的要求:

        import re
        
        def toLowercase(matchobj):
           return matchobj.group(1).lower()
        
        s = 'start TT end'
        re.sub(r'([A-Z]){2}', toLowercase, s)
        >>> 'start t end'
        

        【讨论】:

          【解决方案6】:

          您不能在替换字符串中更改大小写。你需要一个替换函数:

          >>> def replacement(match):
          ...     return match.group(1).lower()
          ... 
          >>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
          'start t end'
          

          【讨论】:

            【解决方案7】:

            你可以用正则表达式来做,只需传递一个函数作为替换,比如the docs 说。问题在于你的模式。

            事实上,您的模式匹配 any 两个大写字母的运行。我将把实际模式留给你,但它以 AA|BB|CC| 开头。

            【讨论】:

              猜你喜欢
              • 2011-03-15
              • 1970-01-01
              • 2011-01-16
              • 2019-04-06
              • 1970-01-01
              • 2018-04-16
              • 2019-09-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多