python-正则表达式捕获逗号或点号,除非令牌之间

时间:2018-09-04 11:02:36

标签: python regex regex-negation

我想用以下格式之一替换数字: 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)

能请你帮忙吗?

1 个答案:

答案 0 :(得分:1)

这不是满足您要求的精确解决方案,但是如果您将否定环视改成正向环视,即断言数字在两侧都被空格或起始/结尾锚点包围,那么您似乎得到了您想要的行为:

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之类的术语不匹配,因为该数字在两侧的空白/锚点中都没有被包围。但是,该模式确实排除了标签中包含的数字。