Python 在字符串中查找数字并将其递减
我有一个HTML页面,其中列出了主题和页码的长索引。我想找到所有页码及其锚定标记链接,并将页码减少Python 在字符串中查找数字并将其递减,python,replace,decrement,Python,Replace,Decrement,我有一个HTML页面,其中列出了主题和页码的长索引。我想找到所有页码及其锚定标记链接,并将页码减少1 以下是HTML中的一行示例: <p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">28</a></p> 注意,您可以将函数作为repl参数传递给,对于模式的每个非重叠出现,该函数将被传递给单个匹配对象: 请注意,这需要match.group()表示一个整数;仅捕
1
以下是HTML中的一行示例:
<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page28">28</a></p>
注意,您可以将函数作为repl
参数传递给,对于模式
的每个非重叠出现,该函数将被传递给单个匹配
对象:
请注意,这需要match.group()
表示一个整数;仅捕获数字,而不包括
和>>页码(减量,行)
“盈亏平衡量(BEV),
”
并且可以类似地应用于“#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)
重新导入
s='盈亏平衡量(BEV),
'
re.sub(r'page(\d+)“>\1',lambda m:'page{0}”>{0}'。格式(int(m.group(1))-1),s)
结果:
<p class="index">breakeven volume (BEV), <a href="ch02.xhtml#page27">27</a></p>
盈亏平衡量(BEV)
使用页面(\d+)>\1
我们匹配页面,后面跟一个数字,后面跟一个“>,后面跟第一对括号(\1
)中的模式中相同的数字
替换函数以匹配作为参数。因此,我们采用匹配的第一组(
m.group(1)
),这是数字,我们解析它并将其递减。然后我们使用递减的数字重新构造新字符串。参数step=
是无用的,因为绝对没有办法提供它。如果您确实需要它,您可以这样做:def decrementer(step=1):返回lambda match:str(int(match.group())-step)
然后page_num.sub(decrementer(),line)
或page_num.sub(decrementer(2),line)
@Matt有两种方法提供它:使用functools.partial
或lambda
。也就是说,我认为你的方法(除了lambda
用法之外)更简洁。在这一点上,将整个函数作为lambda内联会更容易。或者你可以做我所做的。顺便说一句,我希望我能给你第二个+1来说明HTML不是一种正则语言。尽管在这种情况下OP似乎有一个有限的数据集,在其中正则表达式可以在没有为了解决一般情况下的问题。@Matt我认为这就是人们最终使用正则表达式解析HTML的原因-对于他们开始使用的有限集合来说,这似乎更简单,但不可避免地会出现边缘大小写,表达式变得更复杂,然后他们可能最好咬紧牙关,从一开始就正确解析!这可能很好o提供更多的解释,而不是内联所有内容并让OP拖网查看……也就是说,我喜欢用一体式方法替换这两个值。感谢@jornsharpe的反馈谢谢你,我自己永远无法理解这一点!我能够将你的代码合并到我的代码中,让它解析xml逐行并将其作为一个新文件输出。@JohnGayle它应该处理整个xml,而不是逐行处理……如果不这样做,它可能需要一个tweak@JuniorCompressor这是我用p=re.sub(r'page(\d+)”>\1',lambda m:'page{0}>{0}'。格式(int(m.group(1))-1),行.rstrip()
然后将结果写入文本文件。
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>'
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>