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. 正则表达式可以很恐怖,真得很恐怖. ...
随机推荐
- 牛客练习赛41E(球的体积并)
球冠公式是\(\frac{\pi h^2(3R-h)}{3}\),这样再余弦公式用\(R_a\)和\(R_b\)导一导两个球冠的\(h\)就做完了.算是补了个camp时没做出来的小坑了. #inclu ...
- hdu1494 跑跑卡丁车(动态规划)
Description 跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣.这款游戏的特别之处是你可以通过漂移来获得一种 加速卡,用这种加速卡可以在有限的时间里提高你的速度. ...
- Vue --6 router进阶、单页面应用(SPA)带来的问题
一.Vue-router进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二.单页面应用(SPA)带来的问题 1.虽然单页面应用有优点,但是,如果后端不做服务器渲染(h ...
- Apache Atlas是什么?
不多说,直接上干货! Apache Atlas是Hadoop社区为解决Hadoop生态系统的元数据治理问题而产生的开源项目,它为Hadoop集群提供了包括数据分类.集中策略引擎.数据血缘.安全和生命周 ...
- var type = $('#<%=DropDownListRateType.ClientID %>').val();DropDownListRateType.ClientID是什么意思
<%=DropDownListRateType.ClientID %>这个是C#绑定服务器控件在客户端ID, 比如你的DropDownListRateType你定义一个id,如果你用了模板 ...
- C#调用C++接口返回字符串的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 现在有这样一种情景,假如C#调用C++接口需要返回一个字符串.因为字符串是不定长的,因此传递一个定长的字符串进去是不合 ...
- 前端APP打包管理规范
1.包命名规范1)说明打包人:姓名拼音首字母小写 dev:开发环境 test:测试环境 pre:预发布环境 prod:正式环境 例如:版本号:1.2.3,说明:第一个数字大版本:变更框架.调整结构时变 ...
- Win10权限问题
通过组策略打开Administrator用户后,Edge.图片查看器等内置程序不能使用,提示“无法使用内置管理员账户打开” 网上的方法: 1.组策略:本地安全策略编辑器——安全设置——本地策略——安全 ...
- 洛谷 P2002 消息扩散
题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着. 题目描述 有n个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出n个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有n ...
- FMDB的使用方法(附Demo)
http://www.jianshu.com/p/54e74ce87404 最近在项目中需要在多个页面对同样的数据进行相关操作,于是便用到了FMDB数据库操作,以下便是FMDB的一些简单的使用方法.附 ...