日志

Python通过正则表达式验证素数

素数:除了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 (1既不是素数也不是合数)
  2. ^(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也不为自身的因数,所以如果正则成功匹配则该数是合数,反之素数
转载请注明出处:

© http://hejunhao.me