Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在字符串中查找数字并将其递减_Python_Replace_Decrement - Fatal编程技术网

Python 在字符串中查找数字并将其递减

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()表示一个整数;仅捕

我有一个HTML页面,其中列出了主题和页码的长索引。我想找到所有页码及其锚定标记链接,并将页码减少
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>