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

时间:2018-02-06 17:09:47

标签: 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>

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

<dot><tick><number> i.e. .`0 or .`1 or .`2 et cetera

<dash><number> i.e. -1 or -2 or -3

请注意,它从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='')

如何实现我的目标?

2 个答案:

答案 0 :(得分:4)

你自己几乎就是​​解决方案了!

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

因此相关的代码行变为:

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


可以进行的另一项细微修改是将.groups()[0]更改为.group(1)。您可以在documentation中详细了解group及其用法。

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

答案 1 :(得分:1)

你可以试试这个:

<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>

输出:

SELECT RequestID, empName, RequestType, RequestDesc, RequestStartDate
FROM TOR 
WHERE (RequestStartDate > @StartDate)
AND (RequestEndDate < @EndDate) AND (granted = @State)