20181206(re,正则表达式,哈希)
1、re&正则表达式
2、hashlib
一:re模块&正则表达式
正则:正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式得到的是一个列表。
import re
\w 匹配字母数字下划线:
res = re.findall('alex','hahhaha alex is alex is dsb') #逐字匹配,一旦匹配成功就会完整跳过匹配上的字符串。例如在abcabcabca中,能够寻找到的abca为括号中的内容(abca)bc(abca)
print(res)
输出结果:
['alex', 'alex']
print(re.findall('\w','Aa12 _+-'))
输出结果:
['A', 'a', '1', '2', '_']
print(re.findall('\w\w','Aa12 _+-')) #得到两个连续的列表\数字\下划线
输出结果:
['Aa', '12']
print(re.findall('\w9\w','Aa912 s9_+-')) #得到三个连续的列表\数字\下划线,其中中间的字符必须是9
输出结果:
['a91', 's9_']
print(re.findall('^alex','alex id alex')) #^表示近从头开始匹配
print(re.findall('^alex',' alex id alex')) #此处开头有空格
输出结果:
['alex']
[]
print(re.findall('alex$',' alex id alex')) #$表示从文件末尾开始寻找,末尾没有就返回空列表
输出结果:
['alex']
. 代表一个字符,该字符可以是除换行符之外的任意字符
print(re.findall('a.c','a a1c aaac a c jkdsajfkd')) #得到三个字符,首尾是ac,中间是除换行符之外的任意字符
输出结果['a1c', 'aac', 'a c']
print(re.findall('a.c','a a1c aaac a c jkda\ncd')) #\n表示换行符
输出结果为:
['a1c', 'aac', 'a c']
print(re.findall('a.c','a a1c aaac a c jkda\ncd',re.DOTALL)) #re.DOTALL表示.可以代表所有的字符,包括换行符(\n当成一个字符来处理)
输出结果为:
['a1c', 'aac', 'a c', 'a\nc']
[]代表匹配一个字符,这一个字符可以自定义范围。# [a,]表示a或者,!!!
print(re.findall('a[0-9]c','a a1d a2ca aaa a\nc',re.DOTALL)) #获得一个首尾两端为ac且中间为0~9中的一个数字的字符串列表。[0-9]中的横杠表示从哪到哪的意思,表示的是一个范围。
输出结果为:
['a2c']
print(re.findall('a[a-zA-Z]c','a aac a2ca aAc a\nc',re.DOTALL)) #获得一个首尾为ac的,中间是从a到z或从A到Z的字符串列表
输出结果为:
['aac', 'aAc']
print(re.findall('a[ac]c','a aac a2ca aAc a\nc',re.DOTALL)) #获得一个首尾为ac,中间为a或者c的字符串列表
输出结果为:
['aac']
如下例子会报错!因为当横杠在中间时表示的是范围!
print(re.findall('a[+-#/]c','a+c a-c a/c a*c a3c a\nc',re.DOTALL))
解决方法是改为[-+#/][+#/-][+\-#/] 将横杠改为中括号内的首尾,或者加上转义符反斜杠
print(re.findall('a[+\-#/]c','a+c a-c a/c a*c a3c a\nc',re.DOTALL))
修改后的输出结果为:
['a+c', 'a-c', 'a/c']
重复匹配: ?*+{n,m}均不能单独使用,左侧必须有字符。
?代表左边那一个字符出现0次到1次
print(re.findall('ab?','a ab abb abbb a123b a123bbb'))
输出结果:
['a', 'ab', 'ab', 'ab', 'a', 'a']
*代表左边那一个字符出现0次到无穷次
print(re.findall('ab*','a ab abb abbb a123b a123bbb'))
输出结果:
['a', 'ab', 'abb', 'abbb', 'a', 'a']
+代表左边的那一个字符出现1次到无穷次
print(re.findall('ab+','a ab abb abbb a123b a123bbb'))
输出结果:
['ab', 'abb', 'abbb']
{n,m}代表左边那一个字符出现n次到m次
print(re.findall('ab{1,3}','a ab abb abbb a123b a123bbb'))
print(re.findall('ab{1,}','a ab abb abbb a123b a123bbb')) #等同ab+
print(re.findall('ab{0,}','a ab abb abbb a123b a123bbb')) #等同ab*
print(re.findall('ab{3}','a ab abb abbb a123b a123bbb')) #指定出现3次
输出结果为:
['ab', 'abb', 'abbb']
['ab', 'abb', 'abbb']
['a', 'ab', 'abb', 'abbb', 'a', 'a']
['abbb']
[^]取反:
print(re.findall('a[^0-9]c','a a1d a2ca aac a\nc',re.DOTALL)) #表示获得一个长度为3,首尾是ac,中间不是数字的字符串列表
输出结果为:
['aac', 'a\nc']
.* 匹配任意0到无穷个字符,贪婪匹配,不常用。
print(re.findall('a.*c','a345ca34tcsf'))
输出结果:
['a345ca34tc'] #取到最远的c
.*?匹配任意0个到无穷个字符,非贪婪匹配,常用。
print(re.findall('a.*?c','a31c34atcsf')) #表示碰到首尾是ac的就取出,就近原则。可能会输出过个结果。
输出结果为:
['a31c', 'atc']
|代表或者,连接两个正则表达式。
print(re.findall('company|companies','Too many companies have gone bankrupt, and the next one is my company')) #寻找company或companies
输出结果为:
['companies', 'company']
()分组
print(re.findall('compan(y|ies)','Too many companies have gone bankrupt, and the next one is my company')) #匹配成功后只输出括号内的字符
输出结果为:
['ies', 'y']
print(re.findall('compan(?:y|ies)','Too many companies have gone bankrupt, and the next one is my company')) #findall的结果不是匹配的全部内容,而是组内的内容。?:可以让结果为匹配的全部内容。
输出结果:
['companies', 'company']
小综合应用,寻找视频链接地址:
print(re.findall('href="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>'))
输出结果为:
['https://www.douniwan.com/1.mp4', 'https://www.xxx.com/2.mp4']
'href="(.*?)"' 查找:href="(.*?)"类似的内容,匹配成功后只输出括号内的内容。
\转义相关:
python本身没有正则表达式,是识别语法后交给cpython解释器去执行正则表达式。
print(re.findall('a\\\\c','a\c aac')) #\是转义符,第一个转义第二个,第三个转移第四个,交给解释器为'a\\c',解释器语法识别转义,第一个转义第二个,就是'a\c'了
print(re.findall(r'a\\c','a\c aac')) #r原生输入,解释器拿到的就是a\\c了
输出结果为:
['a\\c'] #没办法,只能这么显示,第一个转义第二个\,实际应理解为'a\c'
['a\\c']
re.I 忽略大小写
print(re.findall('alex','my name is alex Alex is sb alex Alex',re.I))
输出结果:
['alex', 'Alex', 'alex', 'Alex']
re.M
msg="""
my name is egon
sfaf egon
sdf23 egon
"""
print(re.findall('egon$',msg,)) #只从后面找第一个,msg内容看作是一行的内容
输出结果为:
['egon']
msg="""
my name is egon
sfaf egon
sdf23 egon
"""
print(re.findall('egon$',msg,re.M)) #识别换行符,找到每一个line最后的字符
输出结果为:
['egon', 'egon', 'egon']
re模块的其他方法:
re.search方法:找到一次就不找了,如果找不到就返回None。
print(re.search('href="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>'))
输出结果为:
<_sre.SRE_Match object; span=(14, 51), match='href="https://www.douniwan.com/1.mp4"'> #match内容是完整内容,而不是组内内容!
如果没找到,输出结果为:
None
res=re.findall('(href)="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>')
print(res)
输出结果: #组内内容全部输出,无法指定。
[('href', 'https://www.douniwan.com/1.mp4'), ('href', 'https://www.xxx.com/2.mp4')]
re.serch.group()功能可以指定输出组内的内容。
res=re.search('(href)="(.*?)"','<p>动感视频</p><a href="https://www.douniwan.com/1.mp4">逗你玩呢</a><a href="https://www.xxx.com/2.mp4">葫芦娃</a>') #注意匹配项里的两个元组
print(res)
print(res.group(0)) #不传参或者参数为0表示匹配内容完整输出
print(res.group(1)) #输出匹配内容的第一处元组内容
print(res.group(2)) #输出匹配内容的第二处元组内容,如果传的参数大于实际元组数 ,则会报错
输出结果为:
href="https://www.douniwan.com/1.mp4"
href
https://www.douniwan.com/1.mp4
re.match()等同于re.search(^)
print(re.findall('alex','alex is alex is alex'))
print(re.search('alex','is alex is alex'))
print(re.search('^alex','is alex is alex'))
print(re.match('alex','alex is alex is alex'))
输出结果为:
['alex', 'alex', 'alex'] #findall查找所有
<_sre.SRE_Match object; span=(3, 7), match='alex'> #查找到一个就结束
None #只从头开始找,如果首字符没有匹配就返回None
<_sre.SRE_Match object; span=(0, 4), match='alex'> #只从头开始找,如果首字符没有匹配就返回None,等同于re.search(^)
re.compile方法
pattern=re.compile('alex') #目标字符
print(pattern.findall('alex is alex is alex'))
print(pattern.search('alex is alex is alex'))
print(pattern.match('alex is alex is alex'))
输出结果为:
['alex', 'alex', 'alex']
<_sre.SRE_Match object; span=(0, 4), match='alex'>
<_sre.SRE_Match object; span=(0, 4), match='alex'>
练习
计算器作业
msg="1-2*(60+(-40.35/5)-(-4*3))"
print(re.findall('\D?(\-?\d+\.?\d*)',msg))
输出结果:
['1', '2', '60', '-40.35', '5', '-4', '3']
二、hashlib模块
hashlib下面有许多算法,hash本身也是一种算法。
用途:对数据进行校验
hash:是一种算法,该算法接收一系列的数据,运算得到返回值
返回值是hash值
三大特性:
"""
1、只要传入的内容一样,那么得到的hash值就一定是一样的
2、只要采用hash算法固定,无论传入的内容多大,hash值的长度是固定的
3、hash值不可逆,即不可能通过hash值逆推出内容
1+2=》文件完整性校验
3==》加密传输的数据
"""
import hashlib
m=hashlib.md5() #此处采用md5哈希算法
m.update('你好'.encode('utf-8')) #按照utf8格式编码。
m.update('hello'.encode('utf-8'))
print(m.hexdigest())
输出结果为:
65c83c71cb3b2e2882f99358430679c3
也可以写成:
m=hashlib.md5() #此处采用md5哈希算法
m.update('你好hello'.encode('utf-8')) #按照utf8格式编码。
print(m.hexdigest())
输出结果为:
65c83c71cb3b2e2882f99358430679c3 #哈希值与上例中相同。
m1=hashlib.md5(b'hello') #也可以直接输入英文,前面用b表示是Bytes类型。
print(m1.hexdigest())
20181206(re,正则表达式,哈希)的更多相关文章
- os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法
一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...
- C# 正则表达式大全
文章导读 正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的 ...
- 汉字正则表达式[\u4E00-\u9FFF]原因
转载易天:正则表达式的汉字匹配 这里是几个主要非英文语系字符范围 2E80-33FFh:中日韩符号区.收容康熙字典部首.中日韩辅助部首.注音符号.日本假名.韩文音符,中日韩的符号.标点.带圈或带括符文 ...
- c# 正则表达式用法
C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:41529 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...
- C#正则表达式Regex类的用法
C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...
- java正则表达式语法详解及其使用代码实例
原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- 正则表达式,Regex类
C#regex是正则表达式类用于string的处理,查找匹配的字符串.1,先看一个例子Regex regex=new Regex(@”OK“)://我们要在目标字符串中找到"OK" ...
- Javascript正则表达式完全学习手册
正则表达式看起来很吓人,不容易让人亲近,但它的确很好用,可以很大程度上提高你的开发效率.本文从零开始介绍了应如何学习正则表达式.文中范例主要为JavaScript. 正则表达式可以很恐怖,真得很恐怖. ...
随机推荐
- Hive进阶_Hive数据查询
简单查询和fetch task 简单查询: 简单查询的 fetch task 功能,从HDFS拉取,不用map reduce. 前两种配置,当前session有效.修改hive-site.xml永 ...
- 【手撸一个ORM】第一步、实体约定和描述
一.约定 数据实体必须实现 IEntity 接口,该接口定义了一个int类型的Id属性,既每个实体必须有一个名称为Id的自增主键. 若数据表的主键列名称不是Id,可以通过 [MyKey("主 ...
- angular4和asp.net core 2 web api
angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...
- nuxt.js实战踩坑记录
读万卷书不如行万里路,必须实践出真理! 看官方文档安装项目vue init nuxt-community/starter-template <project-name>注意:这是新手项目不 ...
- 01SpringBase
Spring (容器) 概述: 01.Java EE开发者的春天 02.主要目的是 降低业务逻辑层和其他层的耦合度 IOC 03.spring容器是用来创建(new)和管理(对象之间的关系)程序中所有 ...
- vfp使用笔记
1:update数据,根据记录中某个字段的值,从另一个表中查询并填充数据 UPDATE cs2013yy SET cs2013yy.ksh=NVL((SELECT cs2013gkbm.ksh FRO ...
- spring Cloud中,解决Feign/Ribbon整合Hystrix第一次请求失败的问题?
Spring Cloud中,Feign和Ribbon在整合了Hystrix后,可能会出现首次调用失败的问题,要如何解决该问题呢? 造成该问题的原因 Hystrix默认的超时时间是1秒,如果超过这个时间 ...
- Python3+Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )
!/usr/bin/env python -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记14(等待判断 鼠标事件 )'''from selenium im ...
- App测试流程及测试点
1 APP测试基本流程 1.1流程图 接收版本 尽快申请到正式环境下测试 不符 App测试版本送测规范 用户行为统计测试 后台订单统计测试 尽快申请到正式环境下测试 兼容性测试.性能压力测试 功能测试 ...
- 使用jmeter测试数据库性能
出现如图所示的问题 解决办法: 1.下载驱动包,将mysql-connector-Java.jar分别放到Jmeter和Java安装目录的lib和ext目录下 链接:http://pan.baidu. ...