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

时间:2014-11-26 07:11:18

标签: python regex backreference

简单的正则表达式问题:

我想用pagenumber +某个数字(比如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)

屈服,当然, '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'

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

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

2 个答案:

答案 0 :(得分:7)

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

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

每当找到匹配项时,将查看第二个参数。如果它是一个字符串,那么它将被用作替换,如果它是一个函数,那么将使用match object.调用该函数。在您的情况下,add_pages(r"\1")只是返回{{1本身。因此,r"\1"会转换为此

re.sub

因此,它实际上用相同的替换原始匹配的字符串。这就是它运作的原因。

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

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

print re.sub("(?<=Page )(\d{2})", r"\1", ...)

您正在尝试将add_pages(r"\1") 转换为整数,这是不可能的。这就是它失败的原因。

如何解决这个问题?

写这个的实际方法是,

r"\1"

详细了解def add_pages(matchObject): return str(int(matchObject.group()) + 10) print re.sub("(?<=Page )(\d{2})", add_pages, ...) 功能,here

答案 1 :(得分:1)

def add_pages(matchobj):
    return str(int(matchobj.group(0))+10)


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