为什么此代码返回'static PyObject*\npy_\x00(void)\n{'
?我认为它应该寻找第一组并替换它。另外,我看不到它\x00
来自哪里。
re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',r'static PyObject*\npy_\0(void)\n{','def myfunc():')
看起来像从文档中复制的示例 re,除了你改变了一件。你有:
r'static PyObject*\npy_\0(void)\n{'
它应该是(对第一组使用 \1):
r'static PyObject*\npy_\1(void)\n{'
当您使用\0
时,这被解释为 null 的转义\x00
。如果你真的想要第 0 组(re 匹配的整个子字符串),你需要使用\g<0>
.
\0
不引用匹配的模式。它应该是\g<0>
r'static PyObject*\npy_\g<0>(void)\n{'
这导致
static PyObject*\npy_def myfunc():(void)\n{
如果要替换第一个捕获的组,可以使用\g<1>
,但\1
也可以。
我认为它应该寻找第一组并替换它。
它没有。Pythonre.sub
不会查找第一组并替换它,它会替换整个匹配的模式。您可以对要保留的部件进行分组和重新插入。