正则表达式匹配python

时间:2018-02-13 21:33:21

标签: regex python-2.7

我需要一个匹配SSN的正则表达式。条件如下:

  1. 必须是9位数。
  2. 格式为xxxxxxxxx或xxx-xx-xxxx
  3. 前三个和后四个数字不能全为零。例如000-xx-xxxx,xxx-xx-0000,000-xx-0000无效。
  4. 我想出了这个:

    ((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})
    

    它完成了工作,但我正在寻找一种更简洁的方法来做到这一点。 其次,关于小组的最佳做法是什么。在捕获和非捕获子组方面有什么更好的。

1 个答案:

答案 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