在一个字符串中找出数字并递减

2024-06-08 16:42:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个HTML页面,其中列出了主题和页码的长索引。我想找到所有的页码和它们的锚定标记链接,并将页码递减1。在

下面是HTML中的一个示例行:

<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">28</a></p>

我试图在这两个位置找到28,并递减1。在

到目前为止,我已经找到了这个数字,并用它本身来替换它,但我不知道如何使它减量。目前我的代码:

^{pr2}$

Tags: 标记示例主题index链接html页面class
2条回答

注意,您可以将一个函数作为repl参数传递给^{},对于pattern“的每个非重叠出现,都将传递一个match对象

def decrement(match):
    """Decrement the number in the match."""
    return str(int(match.group()) - 1)

请注意,match.group()表示一个整数;要只捕获数字,而不包括>和{},请使用lookarounds(请参见demo):

^{pr2}$

这可以满足您的要求:

>>> page_num.sub(decrement, line)
'<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">27</a></p>'

并且可以类似地应用于'#page28"'。在

但是,请注意,通常应该使用一个实际的HTML解析器,而不是正则表达式来解析HTML(它不是一种正则语言)。在

替换时可以使用替换函数:

import re
s = '<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">28</a></p>'
re.sub(r'page(\d+)">\1', lambda m: 'page{0}">{0}'.format(int(m.group(1)) - 1), s)

结果:

^{pr2}$

使用page(\d+)">\1我们匹配页面后跟一个数字,后跟一个“>,后跟与第一对括号(\1)中模式中相同的数字。在

替换函数接受匹配项作为参数。所以我们取匹配的第一组(m.group(1)),这就是数字,我们对它进行解析并递减。然后我们使用递减的数字重建新的字符串。在

相关问题 更多 >