为什么这个正则表达式替换中有额外的括号?

Why are there extra parenthesis in this regex substitution?

我的代码行如下所示:

self.request.sendall(some_string)

我想将它们替换成这样:

self.request.sendall(bytes(some_string, 'utf-8'))

这是我当前的 sed 命令:

sed -i "s/\.sendall\((.*)\)/\.sendall\(bytes\(, 'utf-8'\)\)/g" some_file.py

我很接近,但这是我得到的结果:

self.request.sendall(bytes((some_string), 'utf-8'))

我无法弄清楚组替换中多余的左括号和右括号是从哪里来的。有人看到了吗?转义的括号是字面的,需要在那里。 .* 周围的是要组成一个组,以便以后替换,但它们就像成为匹配文本的一部分。

你转义了一组错误的括号,你需要使用

sed -i "s/\.sendall(\(.*\))/.sendall(bytes(, 'utf-8'))/g" some_file.py

注意:您使用的正则表达式风格是 POSIX BRE,因此,

  • 捕获组设置为\(...\)
  • 文字括号仅由 () 字符定义,没有转义符
  • RHS 中的圆括号和点是多余的。

图案详情:

  • \.sendall( - .sendall( 字符串
  • \(.*\) - 第 1 组 (</code>):任意零个或多个字符</li> <li><code>) - 一个 ) 字符
  • .sendall(bytes(, 'utf-8')) - RHS,其中 指第 1 组值。