python regex捕获带有逗号或点的数字,除非标记之间有逗号或点

2024-05-16 09:49:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这就是我想到的:

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

在regex101中进行测试时,我只跳过<;和>;之前的第一个和最后一个数字;。你知道吗

我正在逐行遍历文本文件,并希望替换以下示例的所有出现:

200
200.00
200.000

如果行中已有一个介于<;gt;之间的数字,请跳过该行,为了澄清,我想跳过行中的以下值,而不是用regex替换:

<300>

这是我使用的代码:

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

你能帮忙吗?你知道吗


Tags: 代码标记ltgtre示例格式line
1条回答
网友
1楼 · 发布于 2024-05-16 09:49:37

这并不是对您的需求的精确解决方案,但是如果您将消极的lookarounds更改为积极的lookarounds,它断言数字的两边都被空格或起始/结束锚点包围,那么您似乎得到了您想要的行为:

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')]

Demo

(由Wiktor提供)

这样做的一个限制是,它不会与<234这样的术语匹配,因为数字不会被两边的空格/锚点包围。但是,该模式确实正确地排除了标记中包围的数字。你知道吗

相关问题 更多 >