首页 > 解决方案 > python - 正则表达式用逗号或点捕获一个数字,除非在标记之间

问题描述

我想用以下格式之一替换一个数字:200、200.99、300,555,除非它在 ​​<> 标记之间。例如我想跳过这个:<200>

这就是我想出的:

(?<!<)([\d,|.]+(?:\.\d{2})?)(?!>)

通过在 regex101 中对其进行测试,我只跳过了 < 和 > 之前的第一个和最后一个数字。

我正在逐行迭代文本文件,我想替换所有出现的以下示例:

200
200.00
200.000

带有标记,但如果该行在 <> 之间已经有一个数字,则跳过该行,澄清一下,我想在我的行中跳过以下值,而不是用正则表达式替换:

<300>

这是我使用的代码:

current_line = re.sub("(?<!<)([\d,|.]+(?:\.\d{2})?)(?!>)", ' <num> ', current_line)

你能帮忙吗?

标签: pythonregexregex-negation

解决方案


这不是您要求的确切解决方案,但是如果您将负面环视更改为正环视,即断言数字两边都被空格或开始/结束锚点包围,那么您似乎得到了您想要的行为:

rx = r"(\s|^)([\d,|.]+(?:\.\d{2})?)(?=$|\s)"
s = "I would like to replace a number with one of the following formats: 200, 200.99, 300,555 unless its between the <> tokens. for example I would like to skip this: <200>"
print(re.findall(rx, s))

[(' ', '200,'), (' ', '200.99,'), (' ', '300,555')]

演示

(由维克托提供)

这样做的一个限制是它不会匹配诸如 之类的术语<234,因为数字没有被两边的空格/锚包围。但是,该模式确实正确排除了标签中的数字。


推荐阅读