[问题] 挑出千分位错误的数字

楼主: liquidbox (樹枝擺擺)   2020-03-13 19:32:41
使用语言:Python 3
使用环境:Windows 10
我想制作一个小工具,检查公司所需的文章,其格式是否存在一致性
其中一个格式是,阿拉伯数字必须要加千分位,
例如:123,000元(正确)、123000元(错误)
我知道在这条件下,正确的数字格式应该是:r'\d{1,3}(,\d{3})*(\.\d)?'
可是我现在想要做的是反过来,
就是检查时,遇到不符合的数字就要标记起来,再以人眼确认
以免误修到原本就不是用来表示数值的阿拉伯数字,如西元年份
我想到的条件很简单,
就是只要连续四个以上的阿拉伯数字但中间没逗号就是有嫌疑,所以写r'\d{4,}'
我想请教的是,有没有办法用一条表达式,
在不根据数字后面的文字是年份或货币判断下,
把至少1900~2099年间的西元年份给排除掉
因为每篇文章要检查的条件可能高达千种以上,每种都要用一条表达式检查
数字的千分位格式只是其中一个规定,
所以我希望,不到最后一刻别用if条件判断式去排除西元年份,以免可读性变差
才想说看能否整合成一个表达式
作者: CMJ0121 (请多指教!!)   2020-03-13 20:12:00
先捞出来 再转成 int 判断可能比较快
作者: art1 (人,原来不是人)   2020-03-17 09:01:00
(?!(19[0-9][0-9]|20[0-9][0-9]))\d{4,}测试资料有 1989、2010、1,358、4052用这条规则可以筛选出最后的 4052(?!\d{1,3}(,\d{3})(,\d{3})?(\.\d)?)(?!((?=19|20)[0-9][0-9]))\d{4,} 加上前面那段就能得到4052前一条规则是用来排除有千分位的数字,后一条排除西元年份3(?!((?:19|20)[0-9][0-9]))\d{4,} 改成这样比较对(?!((?:19|20)[0-9][0-9]))\d{4,} 改成这样比较对(?!(?:(?:19[0-9]|20[0-2])[0-9])) 这样排除西元感觉更好
楼主: liquidbox (樹枝擺擺)   2020-03-19 19:39:00
谢谢我晚点来试看看,原来还有(?!)(?:)层层套叠的用法
作者: adrianshum (Alien)   2020-03-26 11:20:00
negative look ahead 能做到吗?你的“连续4数字没逗号”会miss掉逗号错位的case 吧...
作者: asglay (收收收尾)   2020-04-18 06:10:00
\d{5,}|(?:0[0-9]|1[0-8]|2[1-9])\d{2}

Links booklink

Contact Us: admin [ a t ] ucptt.com