2013-05-28 56 views
0

为什么这段代码返回'static PyObject*\npy_\x00(void)\n{'?我认为它应该寻找第一组并替换它。另外,我没有看到\x00来自哪里。Python中的正则表达式替换

re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',r'static PyObject*\npy_\0(void)\n{','def myfunc():') 
+0

我认为x00来自\ 0 – PSS

+0

uhhhh ...更多上下文? – Colleen

+0

尝试将'\ 0'更改为'\ 1'? – perreal

回答

1

看起来像从docs for re复制的示例,只是您更改了一个部分。 您有:

r'static PyObject*\npy_\0(void)\n{' 

它应该是(使用\ 1为第一组):

r'static PyObject*\npy_\1(void)\n{' 

当您使用\0,这被解释为逃逸空\x00。如果你真的想要组0(整个子字符串与re匹配),你需要使用\g<0>

0

\0未引用匹配的模式。它应该是\g<0>

r'static PyObject*\npy_\g<0>(void)\n{' 

这导致

static PyObject*\npy_def myfunc():(void)\n{ 

如果你想更换第一捕获组,你可以使用\g<1>,但\1也会起作用。

0

我认为它应该寻找第一组并替换它。

它没有。 Python的re.sub不寻找第一组并替换它,它取代了整个匹配模式。您可以分组并重新插入要保留的部分。