35

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

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

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

4

7 回答 7

56

传递一个函数作为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 的回答。)

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

给出:

'start t end'
于 2010-11-10T14:27:49.037 回答
7

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

>>> def replacement(match):
...     return match.group(1).lower()
... 
>>> re.sub(r'([A-Z])\1', replacement, 'start TT end')
'start t end'
于 2010-11-10T14:29:21.210 回答
1

您可以使用正则表达式来完成,只需像文档说的那样传递一个函数作为替换。问题是你的模式。

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

于 2010-11-10T14:27:49.653 回答
1
def replace(s):
    return " ".join(re.findall(r"[A-Z]){2}", s)).lower()

我想这就是你要找的。

于 2020-06-16T09:44:05.470 回答
0

标识替换的 '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'
于 2010-11-10T14:30:03.157 回答
0

试试这个:

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,}'.

于 2010-11-10T14:34:03.337 回答
0

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

我不知道极端情况的可能性有多大,但这就是 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
"""
于 2010-11-10T15:55:27.150 回答