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