gpt4 book ai didi

python - 正则表达式检测 csv 文件中包含逗号的数字的无效行

转载 作者:行者123 更新时间:2023-12-01 23:54:21 28 4
gpt4 key购买 nike

下面是我文件中的示例行。每行有 3 个数字字段。有些数字有逗号并被引用。有些行有多余的逗号(文件是从 pdf 中提取表格数据输出的)我正在尝试检测并删除有效的 3 字段匹配左侧或右侧的多余空字段。

"3,33","4,03","12,23" - valid  
2,,"3,23" - valid
,,"3,13",1,6 - invalid - remove first 2 commas
,1,,"3,987", - invalid - remove comma at beginning and end

这就是我所拥有的 - (([0-9,]*,){3})但正在努力找出如何匹配可能包含或不包含数字的引号。

基本上我不清楚如果检测到引号然后如何查找结尾引号,如果没有,则不查找任何结尾引号。感谢您的帮助!

(我正在使用 sublimetext 3 进行搜索和替换,但如果需要,我可以在 Python 中完成。)

最佳答案

看起来你的字段内容可能是:

  • 一个整数\d+
  • 带引号的十进制数 "\d+,\d+"

这可以表示为(|\d+|"\d+,\d+")。您需要其中三个,以逗号分隔:

(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+")

(您可以使用 (|\d+|"\d+,\d+")(,(|\d+|"\d+,\d+")){2} , 但同样的东西重复三次更容易理解)。

请注意,这只是假设最后一个字段为“空”,因为这足以满足您的定义。所以我们需要把它锚定在行首和行尾:

^(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+")$

这将只匹配有效的行。

根据您的解释,开头和结尾可能会有额外的逗号,但没有其他字符,因此应该是:

^,*(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+"),(|\d+|"\d+,\d+") ,*$

这现在匹配所有行,但没有给你你真正关心的,中间的“好”部分。为此,您可以使用一个组(使用括号)。虽然我们已经在使用组,但对于 | 替代方案,所以我们需要添加 ?: 使它们成为非捕获:

^,*(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),*$

现在,您可以将您关心的部分包装在捕获组中,为我们提供最终的正则表达式:

^,*((?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+"),(?:|\d+|"\d+,\d+")),*$

在正则表达式模式下搜索和替换,使用此正则表达式进行搜索,使用 \1 进行替换值。

如果多个字段为空,则可能有多种可能的解决方案。如果您的三个值中的第一个和最后一个值永远不会为空,您可以相应地调整正则表达式。如果是,这将选择一组 有效值,这可能不是您想要的。例如,如果您有:

,,1,"2,3",,

那么 ,1,"2,3 (empty, 1, 2.3) 和 1,"2,3", (1, 2.3, empty) 都会是可能的解决方案。默认情况下,您将获得第二个结果,因为 * 是贪婪的,即第一个 ,* 将尝试“吃掉”尽可能多的逗号不会使匹配失败。您可以添加这样的问号:,*? 使匹配“惰性”或“非贪婪”,然后它将只使用所需数量的逗号到(产生第一个结果)。

关于python - 正则表达式检测 csv 文件中包含逗号的数字的无效行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63023185/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com