在字符串中查找数字并减少它们

时间:2015-04-07 21:07:45

标签: python replace decrement

我有一个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)

2 个答案:

答案 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(不是常规语言)。

相关问题