我有一个HTML页面,列出了主题和页码的长索引。我想查找所有页码及其锚标记链接,并按1
递减页码。
以下是HTML中的示例行:
<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">28</a></p>
我正在尝试在两个地方找到数字28
并按1
递减。
到目前为止,我已经能够找到数字并将其替换为自己,但我无法弄清楚如何减少它。到目前为止我的代码:
import fileinput
import re
for line in fileinput.input():
line = re.sub(r'\>([0-9]+)\<', r'>\1<', line.rstrip())
print(line)
答案 0 :(得分:3)
您可以在替换时使用替换函数:
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)
结果:
<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page27">27</a></p>
使用page(\d+)">\1
我们匹配页后跟一个数字,然后是&#34;&gt; ,后跟与模式中相同的数字在第一对括号中{\1
)。
替换函数将参数作为匹配参数。所以我们取第一组匹配(m.group(1)
),这是数字,我们解析它并递减它。然后我们使用递减的数字重建新字符串。
答案 1 :(得分:1)
请注意,您可以将函数作为repl
参数传递给re.sub
,该参数将为每个match
对象“传递pattern
“的非重叠出现:
def decrement(match):
"""Decrement the number in the match."""
return str(int(match.group()) - 1)
请注意,期望match.group()
表示整数;要仅捕获该号码,而不包括>
和<
,请使用外观(请参阅demo):
page_num = re.compile(r'''
(?<=>) # a > before the group
\d+ # followed by one or more digits
(?=<) # and a < after the group
''', re.VERBOSE)
这可以按照您的要求运行:
>>> page_num.sub(decrement, line)
'<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">27</a></p>'
可以类似地应用于'#page28"'
。
但请注意,您通常应使用实际的HTML解析器而不是正则表达式来解析HTML(不是常规语言)。