模块1

 re模块和collections

 

 

 re模块和正则表达式

引子

         判断手机号码是否合法           

方法一:
while True:
    phone_number=input('Please input your phone number')
    if len(phone_number)==11\
            and phone_number.isdigit()\
            and phone_number.startswith('13')\
            or phone_number.startswith('14')\
            or phone_number.startswith('15')\
            or phone_number.startswith('18'):
        print('是合法的手机号码')
    else:
        print('不是合法的')
方法二:
import re
phone_number=input('Please input your phone_number:')
if re.match('^(13|15|17|18)[0-9]{9}$',phone_number):
    print('是合法的手机号码')
else:
    print('不是合法的')
View Code

正则表达不仅在Python领域很重要,在整个编程界都占有举足轻重的地位

正则表达式的官方定义:对字符串操作的一种逻辑公式,就是事先定义好一个特定字符或一些特定字符的组合,组成一个‘规则字符串’,用来表达对字符串的一种逻辑过滤

字符组:在同一位置可能出现的各种字符组成字符组,在正则表达式中用[]表示


正则表达式
元字符 匹配内容
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符
\b 匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结束
\W 匹配非字母或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[....] 匹配字符组中的字符
[^....] 匹配除了字符组中字符的所有字符
<.*> 贪婪匹配模式,会匹配尽量长的字符串
<.*?> 加上?为 非贪婪模式,会匹配尽量短的字符串

量词 用方法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m}重复n次到m次

几个常用的非贪婪匹配
* ? 重复任意多次,但尽可能的少重复
+ ? 重复一次或更多次 但尽可能的少重复
?? 重复零次或一次 但尽可能的少重复
{n}? 重复n次 但尽可能的少重复
{n,}? 重复n次或更多次 但尽可能的少重复
{n,m}?重复n次到m次 但尽可能的少重复


*,+,?都是贪婪匹配,也就是尽可能的匹配,后面加?使其变成惰性匹配


转义符\
在正则表达式中,有很多特殊意义的是元字符


re 模块下的常用方法

import re
ret=re.findall('o','lanbo,xiebaobao,wangshanglong,madeshengooooo')
print(ret) #凡是满足匹配条件的结果都放在列表里,有多少放多少,不会显示个数
ret=re.search('e','eva egon ').group()
ret=re.match('a','abc').group()
print(ret)
ret=re.sub('\d','H','eva3egon4yuan4')
print(ret) #替换,相当于replace
ret=re.subn('\d','H','eva3egon4yuan4')
print(ret)
obj=re.compile('\d{6}')#编译成一个正则表达式对象,规则要匹配的是3个数字
ret=obj.search('123123abcdeeee')#正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #数字不能放在字母中间,否则会出错,后面,但不能分开放
obj=re.compile('\D{6}')
ret=obj.search('123fgs--==')
print(ret.group())
ret=re.finditer('\d','ds3sy4784a')#finditer返回一个存放匹配结果的迭代器
print(ret)
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print(next(ret).group()) #查看第三个结果
print(i.group() for i in ret) #查看剩余的左右结果
#返回的结果为<generator object <genexpr> at 0x00000000022588E0>表示看不懂

findindall优先级查询
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)


split的优先级查询
ret=re.split('\d+','eva3egon4lanb5')
ret=re.split('(\d+)','eva3egon4lanb5') #加括号后保留了匹配的项
print(ret)

collections模块
在内置数据类型(int list set tuple)的基础上,collections
还提供了几个额外的数据类型:Conter deque defaultadict
namedtuple和OrderedDict
namedtuple:生成可以使用名字来访问元素内容的tuple
deque:双端队列,可以快速的从另外一侧追加和退出对象
Counter:计数器,主要用来计数
OrderedDict:有序字典
defaultdict:带有默认值的字典
from collections import namedtuple

namedtuple
Point=namedtuple('Point',['x','y'])
p=Point(1,2)
print(p.x)
print(p.y)

用坐标和半径表示一个圆
Circle=namedtuple('Circle',['x','y','r'])


deque #为了高效的实现插入和删除操作的双向列表,适用于队列和栈
from collections import deque
q=deque(['a','b','c'])
q.append('x')
q.append('y')
q.appendleft('z')
print(q)
q.pop()
q.pop()
q.pop()
q.popleft()
print(q)
orderedDict 有序字典
from collections import OrderedDict
od=OrderedDict()
od['z']=1
od['y']=2
od['x']=3
od['t']=4 #按照插入的key的顺序返回
print(od.keys())

defaultdict
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

即: {'k1': 大于66 , 'k2': 小于66}
原生字典的解决方法
l=[11,22,33,44,55,66,77,88,99]
d={'k1':[],'k2':[]}
for i in l:
if i>66:
d['k1'].append(i)
else:
d['k2'].append(i)
print(d)
defaultdict字典的解决方法
from collections import defaultdict
values=[11,22,33,44,55,66,77,88,99]
my_dict=defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
print(my_dict)

使用dict时,如果引用的key不存在,就会抛出KeyError.如果希望key不存在时
返回一个默认值,就可以用defaultdict:
from collections import defaultdict
dd=defaultdict(lambda :'N/A')
dd['key1']='abc'
print(dd)
dd['key2'] #key2不存在,返回默认值
print(dd)

Counter 用来跟踪出现的次数,无序的顺序类型,以字典的键值对形式存储,key为元素,value为计数
from collections import Counter
c=Counter('asfuigesh')
print(c)
posted @ 2017-08-08 00:57  兰博~~  阅读(154)  评论(0编辑  收藏  举报