简单的正则表达式问题:
我想用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函数的内容似乎是文字反向引用,而不是它引用的内容。
如果没有将所有匹配的数字提取到列表然后处理和添加,我该怎么做?
答案 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