在许多编程语言中,如下
找到foo([a-z]+)bar并替换GOO\U\1GAR
将导致整个匹配变为大写.我似乎无法找到python中的等价物; 它存在吗?
And*_*ark 39
你可以传递一个函数来re.sub()实现这个,这是一个例子:
def upper_repl(match):
return 'GOO' + match.group(1).upper() + 'GAR'
Run Code Online (Sandbox Code Playgroud)
以及使用它的一个例子:
>>> re.sub(r'foo([a-z]+)bar', upper_repl, 'foobazbar')
'GOOBAZGAR'
Run Code Online (Sandbox Code Playgroud)
你的意思是这样的吗?
>>>x = "foo spam bar"
>>>re.sub(r'foo ([a-z]+) bar', lambda match: r'foo {} bar'.format(match.group(1).upper()), x)
'foo SPAM bar'
Run Code Online (Sandbox Code Playgroud)
作为参考,这里是re.sub(强调我的)文档字符串.
返回通过替换repl替换字符串中最左边不重叠的模式而获得的字符串.repl可以是字符串也可以是可调用的 ; 如果处理了一个字符串,则反斜杠转义. 如果它是可调用的,则传递匹配对象并且必须返回要使用的替换字符串.
如果您已经有一个替换字符串(模板),您可能不会热衷于将其替换为m.group(1)+...+m.group(2)+...+m.group(3)...
您可以使用MatchObject的expand()函数以与sub()相同的方式为匹配评估模板,从而允许您尽可能多地保留原始模板。您可以upper在相关作品上使用。
re.sub(r'foo([a-z]+)bar', lambda m: 'GOO' + m.expand('\1GAR').upper())
Run Code Online (Sandbox Code Playgroud)
虽然这在上面的示例中不是特别有用,并且在复杂情况下没有帮助,但对于具有更多捕获组的较长表达式可能更方便,例如 MAC 地址审查正则表达式,您只需要以确保完全替换是否大写。