我需要一个匹配SSN的正则表达式。条件如下:
我想出了这个:
((0(?!00)|[1-9])\d{4}(0(?!000)|[1-9])\d{3})|((0(?!00)|[1-9])\d{2}-\d{2}-(0(?!000)|[1-9])\d{3})
它完成了工作,但我正在寻找一种更简洁的方法来做到这一点。 其次,关于小组的最佳做法是什么。在捕获和非捕获子组方面有什么更好的。
答案 0 :(得分:0)
正则表达式:^(?!000|.+0{4})(?:\d{9}|\d{3}-\d{2}-\d{4})$
如果您有文字并希望与SSN匹配使用:
\b(?!000|.+0{4})(?:\d{9}|\d{3}-\d{2}-\d{4})\b
。
详细说明:
^
在行的开头断言位置$
在一行结尾处断言位置(?:)
非捕获组{n}
完全匹配n
次(?!)
否定前瞻|
或Python代码:
import re
array = ['000123333','001245565','012548785','123456854','213254000','213250000','123544155','125875400','154878880','000-23-1234','001-23-0000','001-23-1000','120-00-1200','005-64-5541','121-25-1258']
for item in array:
print(bool(re.match(r'^(?!000|.+0{4})(?:\d{9}|\d{3}-\d{2}-\d{4})$', item)))
输出:
000123333 => False
001245565 => True
012548785 => True
123456854 => True
213254000 => True
213250000 => False
123544155 => True
125875400 => True
154878880 => True
000-23-1234 => False
001-23-0000 => False
001-23-1000 => True
120-00-1200 => True
005-64-5541 => True
121-25-1258 => True