素数:除了1和自身外没有其他因数的数称为素数,素数又被称为质数。
验证素数的正则表达式非常简单:
/^1?$|^(11+?)\1+$/
Python实现
import re def checkPrime(n): return re.compile(r'^1?$|^(11+?)\1+$').match('1' * n) is None print[x for x in range(100) if checkPrime(x)] ##########Output############### [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
解释
该正则表达式由两部分组成,准确来说匹配两类情况:
- ^1?$,匹配空字符串和1 (1既不是素数也不是合数)
- ^(11+?)\1+$,首先(11+?)非贪婪匹配‘11’,‘111’,‘1111’…等字符串,\1+意味着再匹配至少一次(11+?)的匹配结果,^(11+?)\1+$表示“匹配n个1(n>=2)至少m次(m>=2)”,说白了就是匹配数字n*m,正则表达式会穷举定义域内的任意n*m组合情况,而根据定义可知,n和m是数字n*m的既不为1也不为自身的因数,所以如果正则成功匹配则该数是合数,反之素数