正则表达式:对数字进行反向引用,增加它

ako*_*ako 5 python regex backreference

简单的正则表达式问题:

我想用一个字符串+一些数字(比如10)替换字符串中的页码.我想我可以使用反向引用捕获匹配的页码,对其进行操作并将其用作替换参数re.sub.

这工作(只传递值):

def add_pages(x):
    return x

re.sub("(?<=Page )(\d{2})",add_pages(r"\1") ,'here is Page 11 and here is Page 78\nthen there is Page 65',re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

屈服,当然, 'here is Page 11 and here is Page 78\nthen there is Page 65'

现在,如果我更改add_pages函数来修改传递的反向引用,我会收到错误.

def add_pages(x):
        return int(x)+10


re.sub("(?<=Page )(\d{2})",add_pages(r"\1") ,'here is Page 11 and here is Page 78\nthen there is Page 65',re.MULTILINE)

ValueError: invalid literal for int() with base 10: '\\1'
Run Code Online (Sandbox Code Playgroud)

,因为传递给add_pages函数的内容似乎是文字反向引用,而不是它引用的内容.

如果没有将所有匹配的数字提取到列表然后处理和添加,我该怎么做?

the*_*eye 7

实际问题是,您应该将函数传递给第二个参数re.sub,而不是调用函数并传递返回值.

为什么它在第一种情况下有效?

只要找到匹配项,就会查看第二个参数.如果它是一个字符串,那么它将被用作替换,如果它是一个函数,那么将使用匹配对象调用该函数.在你的情况下,add_pages(r"\1")简单地回归r"\1"自己.所以,re.sub翻译成这个

print re.sub("(?<=Page )(\d{2})", r"\1", ...)
Run Code Online (Sandbox Code Playgroud)

因此,它实际上用相同的替换原始匹配的字符串.这就是为什么它有效.

为什么它在第二种情况下不起作用?

但是,在第二种情况下,当你这样做

add_pages(r"\1")
Run Code Online (Sandbox Code Playgroud)

你试图转换r"\1"为一个整数,这是不可能的.这就是失败的原因.

如何解决这个问题?

写这个的实际方法是,

def add_pages(matchObject):
    return str(int(matchObject.group()) + 10)
print re.sub("(?<=Page )(\d{2})", add_pages, ...)
Run Code Online (Sandbox Code Playgroud)

在这里阅读有关该group功能的更多信息