Python正则表达式并用递增的数字替换

ara*_*ert 4 python regex

我有一个文件,其中包含几行有问题的语法,我想找到它的所有出现并用可接受的语法替换它。

例子:

<field id="someId" type="xs:decimal" bind="someId">
    <description/>
    <region id="Calc.R_315.`0" page="1"/>
    <region id="Calc.R_315.`1" page="1"/>
</field>
Run Code Online (Sandbox Code Playgroud)

我想用字符串替换所有出现的

<dot><tick><number> i.e. .`0 or .`1 or .`2 et cetera
Run Code Online (Sandbox Code Playgroud)

<dash><number> i.e. -1 or -2 or -3
Run Code Online (Sandbox Code Playgroud)

注意它从 1 而不是 0 开始。

我有以下 python 代码,它执行内联替换,但是它从 0 开始,我希望它从 1 开始。

with fileinput.input(files="file.xml", inplace=True, backup='.original.bak', mode='r') as f:
    for line in f:
        pattern = "\.`(\d+)"
        result = re.sub(pattern, lambda exp: "-{}".format(exp.groups()[0]), line)
        print(result, end='')
Run Code Online (Sandbox Code Playgroud)

如何实现我的目标?

nis*_*ide 5

您自己就快找到解决方案了!

剩下的唯一事情就是将捕获的数字转换为int,并在其上加 1。简单的!

所以相关的代码行变成:

result = re.sub(pattern, lambda exp: "-{}".format(int(exp.groups()[0]) + 1), line)
Run Code Online (Sandbox Code Playgroud)


另一个可以进行的轻微修改是更改.groups()[0].group(1). 您可以group文档中了解更多信息及其用法。

最后一件事:最好将您的正则表达式模式定义为原始字符串,以避免将来出现任何麻烦。


Aja*_*234 3

你可以试试这个:

import re
s = """
<field id="someId" type="xs:decimal" bind="someId">
   <description/>
   <region id="Calc.R_315.`0" page="1"/>
   <region id="Calc.R_315.`1" page="1"/>
</field>
"""
new_s = re.sub('\.`\d+', '{}', s).format(*map(lambda x:'-{}'.format(int(x)+1), re.findall('(?<=\.`)\d+(?=")', s)))
print(new_s)
Run Code Online (Sandbox Code Playgroud)

输出:

<field id="someId" type="xs:decimal" bind="someId">
  <description/>
  <region id="Calc.R_315-1" page="1"/>
  <region id="Calc.R_315-2" page="1"/>
</field>
Run Code Online (Sandbox Code Playgroud)