python - 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)
你能帮忙吗?
解决方案
这不是您要求的确切解决方案,但是如果您将负面环视更改为正环视,即断言数字两边都被空格或开始/结束锚点包围,那么您似乎得到了您想要的行为:
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
,因为数字没有被两边的空格/锚包围。但是,该模式确实正确排除了标签中的数字。
推荐阅读
- ironpython - 多个 Y 列使用 IronPython 散点图颜色
- java - 如何从 ScheduledExecutorService 获取队列和池大小
- ios - 在 iOS 13.1 上使用输入按钮时,离子搜索栏没有触发我的功能
- java - 扩展父类时出现 BeanDefinitionOverrideException
- arrays - 如何使用某些条件和分隔符拆分字符串
- kubernetes - 如何根据外部指标“或”匹配 HorizontalPodAutoscaler 中的 metricSelector
- javascript - useCallback 与简单函数
- regex - 在标题中提取回复
- javascript - 在事件处理程序中进行 setState 调用后,React 何时重新渲染
- scala - 如何将 Java api KStream 转换为 Scala api KStream?