Python正则表达式替换组

时间:2013-05-28 21:20:03

标签: python regex

为什么此代码会返回'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():')

3 个答案:

答案 0 :(得分:1)

看起来这个例子是从docs for re复制的,除了你改变了一件。 你有:

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

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

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

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

答案 1 :(得分:0)

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

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

这导致

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

如果您要替换第一个捕获的组,可以使用\g<1>,但\1也可以使用。

答案 2 :(得分:0)

  

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

没有。 Python的re.sub不会查找第一个组并替换它,它会替换整个匹配的模式。由您来分组并重新插入您想要保留的部分。