【问题标题】:python - regex to capture a number with comma or a dot unless between tokenspython - 正则表达式用逗号或点捕获数字,除非在标记之间
【发布时间】:2019-02-09 09:37:41
【问题描述】:

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

这是我想出的:

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

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

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

200
200.00
200.000

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

<300>

这是我使用的代码:

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

您能帮忙吗?

【问题讨论】:

  • 能否添加一些示例数据?
  • 你想用Text here, then &lt;234 and more here替换234吗?
  • 题目中的例子我写了,我再澄清一下。
  • 您的正则表达式的问题,例如使用输入&lt;200&gt;,可以通过仅匹配中间的0 来满足负环视,左右看两边的数字。
  • 那么,只有&lt;&gt;里面有数字不应该被替换?或者与\d(?:[.,\d]*\d)? 模式对应的任何数字?

标签: python regex regex-negation


【解决方案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 提供)

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

【讨论】:

  • (?&lt;=^|\s)([\d,|.]+(?:\.\d{2})?)(?=$|\s) does not work in Python。不要盲目遵循 regex101,它不能证明该模式在目标环境中有效。
  • @WiktorStribiżew 我们可以摒弃负面的观察,findall 的背后足够复杂,可以使用捕获组。只是不要捕捉模式的前导部分。
  • 这种行为确实是我想要的,但正如已经说过的,它在 python 中不起作用,有什么建议修改它吗?
  • @Andreyn“不起作用”是一个模糊的东西。它适用于 Python,但这个答案真的满足你所有的用例吗?只有你能回答。
  • @TimBiegeleisen 修改后的正则表达式确实有效,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
相关资源
最近更新 更多