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

新手上路,请多包涵

在许多编程语言中,如下

找到 foo([a-z]+)bar 并替换为 GOO\U\1GAR

将导致整个匹配项变为大写。我似乎无法在 python 中找到等效项;它存在吗?

原文由 Jordan Reiter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 706
2 个回答

您可以将函数传递给 re.sub() 这将允许您执行此操作,这是一个示例:

  def upper_repl(match):
     return 'GOO' + match.group(1).upper() + 'GAR'

以及使用它的示例:

  >>> re.sub(r'foo([a-z]+)bar', upper_repl, 'foobazbar')
 'GOOBAZGAR'

原文由 Andrew Clark 发布,翻译遵循 CC BY-SA 3.0 许可协议

不幸的是,这种 \U\1 语法在 Python 中永远无法工作,因为字符串文字中的 \U 表示 32 位十六进制 转义序列 的开头。例如, "\U0001f4a9" == "💩"

然而,通过使用替换 _函数_,可以很容易地替代 Perl 的大小写转换转义。在 re.sub(pattern, repl, string, count=0, flags=0) 替换 repl 通常是一个字符串,但它也可以是一个可调用的。如果它是可调用的, 它会传递 Match 对象并且必须返回要使用的替换字符串

因此,对于问题中给出的示例,这是可能的:

 >>> string = "fooquuxbar"
>>> pattern = "foo([a-z]+)bar"
>>> re.sub(pattern, lambda m: f"GOO{m.group(1).upper()}GAR", string)
'GOOQUUXGAR'

以下是可能对类似大小写转换有用的其他字符串方法表。

修改器描述例子Python 可调用使用\U大写富酒吧 –> 富酒吧str.upper \L小写foo BAR –> foo 栏str.lowerstr.casefold \我首字母大写foo 栏 –> Foo 栏str.title \F第一资本foo BAR –> Foo 栏str.capitalize

原文由 wim 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题