日志

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

日志

Python的all()和any()函数的区别

any和all函数都接受一个可迭代的(iterable)对象

  • 区别

all:当迭代对象为空(empty)或迭代对象中的所有元素都为真(True)时返回True,否则返回False

any:当迭代对象不为空任意一个元素为真(True)即会返回True,否则返回False

  • 函数实现

all:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

any:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False
  • 例子

>>> any(['',1,2,3,False])
True
>>> any([])
False
>>> any(['',0,False])
False
>>> all(['',1,2,3])
False
>>> all([])
True
>>> all([1,2,3])
True
转载请注明出处:

© http://hejunhao.me

日志

Python正则表达式的使用(re模块)

正则表达式不属于任何语言本身,而是独立的用于处理字符串的强大工具,它有独立的语法和处理引擎,只要你熟悉其语法任何语言下都能使用(部分非常用语法可能在各种语言中的支持不一致)Python处理正则表达式主要用到re模块,本文主要介绍re模块的使用,正则表达式相关语法不作为本文重点

  • 相关语法参考

Python正则表达式常用语法解释

  • 关于re模块

re是 regular expression 的缩写,即正则表达式.

通过re模块使用正则表达式主要有三个过程:

  1. 编译正则表达式得到Pattern对象
  2. 通过Pattern对象匹配文本得到Match对象
  3. 从Match对象中获取匹配信息
  • re.compile(pattern[, flag]):

re.compile的第一个参数指定正则表达式字符串,第二个参数可选,用于指定匹配模式:

re.I(IGNORECASE): 忽略大小写
re.M(MULTILINE): 多行模式
re.S(DOTALL): 点任意匹配模式
re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
re.X(VERBOSE): 详细模式.这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释.

该方法返回一个Pattern对象,实际上它是Pattern类的 Factory Method

  • Match对象

每个pattern匹配成功都会返回一个match对象的结果,通过它我们可以获取一次成功匹配的诸多信息

其常用的方法如下:

group([group1, …]): 返回匹配的一组或多组结果,没有则为None,其中参数group1…可以使用别名也可以使用编号,代表第n组结果,当编号为0时代表整个匹配的子串,若参数为多个则以元组形式返回,若不给参数则视为group(0)

groups([default]):返回所有组的匹配结果的元组,相当于group(1,2,3…),没有匹配到的组以default代替,默认None

groupdict([default]): 返回有别名的组的匹配结果的字典,其中别名为键,匹配子串为值

start([group]): 返回指定组的匹配子串在string中的起始索引,group默认值为0

end([group]): 返回指定组的匹配子串在string中的结束索引(最后一个字符的索引+1),group默认值为0

span([group]): 等价于(start(group), end(group))

#-*- coding:utf-8 -*-
import re
p = re.compile(r'My name is (\w+), I am (?P<age>\d+) years old , I come from (?P<city>\w+).')
m = p.match('My name is Felix, I am 10 years old , I come from Canton.')

print "group(0):", m.group(0)
print "group(1):", m.group(1)
print "groups():", m.groups()
print "groupdict():", m.groupdict()
print "start(1):", m.start(1)
print "end(1):", m.end(1)
print "span(1):", m.span(1)

##输出##
# group(0): My name is Felix, I am 10 years old , I come from Canton.
# group(1): Felix
# groups(): ('Felix', '10', 'Canton')
# groupdict(): {'city': 'Canton', 'age': '10'}
# start(1): 11
# end(1): 16
# span(1): (11, 16)
  • Pattern对象

阅读全文

日志

Python正则表达式常用语法解释

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串

  • 正则表达式的作用

  1. 给定的字符串是否符合指定正则表达式的过滤逻辑,即匹配(例如Email地址检测,电话号码合法性判断等)
  2. 根据正则表达式从指定字符串中捕获特定的信息(例如从文章中获取所有含有a字母的单词)
  • 正则表达式的特点

  1. 灵活性、逻辑性、功能性非常强大
  2. 以极简的方式控制复杂的字符串
  3. 可读性差,对初学者晦涩难懂
  • 正则表达式语法(包括Python的专用扩展)

正则表达式由普通字符和元字符两大部分组成,而元字符相当于正则表达式的游戏规则,是其灵魂所在.因此,要掌握正则表达式在表达什么,最关键的就是要弄懂它的元字符的作用规则.

一般字符

.(点号)

匹配除了换行符之外的任意字符,在DOTALL模式下可以匹配换行符

例如:a.cd 匹配 abcd
阅读全文