使用python中的re.sub使字母大写?

Jor*_*ter 25 python regex

在许多编程语言中,如下

找到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)

  • 考虑到,我认为这将是必须要做的,尽管它非常复杂. (2认同)

wim*_*wim 9

你的意思是这样的吗?

>>>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可以是字符串也可以是可调用的 ; 如果处理了一个字符串,则反斜杠转义. 如果它是可调用的,则传递匹配对象并且必须返回要使用的替换字符串.


it4*_*mqy 5

如果您已经有一个替换字符串(模板),您可能不会热衷于将其替换为m.group(1)+...+m.group(2)+...+m.group(3)...

您可以使用MatchObjectexpand()函数以与sub()相同的方式为匹配评估模板,从而允许您尽可能多地保留原始模板。您可以upper在相关作品上使用。

re.sub(r'foo([a-z]+)bar', lambda m: 'GOO' + m.expand('\1GAR').upper())
Run Code Online (Sandbox Code Playgroud)

虽然这在上面的示例中不是特别有用,并且在复杂情况下没有帮助,但对于具有更多捕获组的较长表达式可能更方便,例如 MAC 地址审查正则表达式,您只需要以确保完全替换是否大写。

  • 只是想补充一点,您可能需要将扩展​​字符串显式定义为正则表达式,具体取决于解释器: `m.expand(r'\1')` 有效,而 `m.expand('\1')` 被处理作为 ASCII 001(至少在 3.7.2 上)。 (2认同)