gpt4 book ai didi

python - 正则表达式:获取对数字的反向引用,添加到它

转载 作者:太空狗 更新时间:2023-10-30 00:49:54 25 4
gpt4 key购买 nike

简单的正则表达式问题:

我想用 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)

屈服,当然,'这里是第 11 页,这里是第 78 页\n然后是第 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 函数的似乎是文字反向引用,而不是它引用的内容。

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

最佳答案

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

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

只要找到匹配项,就会查看第二个参数。如果它是一个字符串,那么它将被用作替换,如果它是一个函数,那么该函数将被调用 match object.在您的情况下,add_pages(r"\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, ...)

阅读有关 group 函数的更多信息,here

关于python - 正则表达式:获取对数字的反向引用,添加到它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27143233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com