破译密码

排列

概念:从n个元素中取出m(m<=n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement),特别地,当m=n时,这个排列被称为全排列(Permutation)

'''
需求:1 2 3 4
假设从中取3个数字,然后对这三个数字进行排列
'''
#需求:从[1,2,3,4]4个数中随机取出3个数进行排列
import itertools
myList = list(iterator.permutations([1,2,3,4], 3))
print(mylist)
print(len(mylist))'''
规律总结:
4 - 3  24
4 - 2  12
4 - 1  4
排列的可能性次数:n!/(n-m)!
'''
组合

概念:从m个不同的元素中,任取n(n<=m)个元素为一组,叫做从m个不同元素中取出n个元素的进行组合。

import itertools
'''
[1,2,3,4,5]中选取4个数的组合方式有几种?
'''
myList = list(itertools.combinations([1,2,3,4,5],4))
print(myList)
print(len(muyList))
'''
规律总结:
m   n
5   5   1
5   4   5
5   3   10
5   2   10
m!/(n!x(m-n)!)
'''
排列组合
import itertools
myList = list(itertools.product("0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm",repeat=6))
#可以尝试,有可能电脑会卡住
#多线程也不行,电脑内存不够,咋处理都白搭
print(len(myList))

注意:但凡涉及到密码,一般都会进行加密处理,常见的加密方式有MD5,RSA,DES等。

疯狂破译密码

伤敌一千自损一万的破解方式

import time
import itertoolspassword = ("".join(x) for x in itertools.product("0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm",repeat=6))
#print(len(myList))
while True:try:str1 = next(password)time.sleep(0.5)print(str1)except StopIteration as e:break

正则表达式

常用需求
判断QQ号

需求:设计一个方法,传递一个QQ号,判断这个QQ号码是否合法。

'''
分析:
1.全是数字
2.位数:4~11
3.第一位不能为0
'''def checkQQ(str1):#不管传入的str是否合法,我们假设是合法的result = True#寻找条件推翻最初的假设try:#判断是否全部为数字num = int(str1)if len(str1) >= 4 and len(str1) <= 11:#判断是否以数字[0]开头if str1[0] == '0':result = Falseelse:result = Falseexcept BaseException:result = False
print(ckeckQQ("123284u3t95"))
正则概述

正则表达式(Regular Exception),使用单个字符串来描述,匹配一系列符合某个语句法则的字符串搜索模式

搜索模式可用于文本搜索和文本替换

正则表达式是由一个字符序列形成的搜索模式

当你在文本中搜索数据时,你可以使用搜索模式来描述你要查询的内容

正则表达式可以是一个简单的字符,也可以是一个复杂的模式

正则表达式可用于所有文本搜索和文本替换的操作。

在python中,通过内嵌成re模块,程序员可以直接调用来实现正则匹配,正则表达式被编译成一系列的字节码,然后由c编写的匹配引擎执行。

模块简介

python 自1.5版本增加了re模块,它提供Perl风格的正则表达式模式

re模块使python语言拥有全部的正则表达式功能

re模块提供了与这些方法功能完全一致的函数,这些函数使用一个模式的字符串作为他们的第一个参数。

正则表达式的元字符
import re
#匹配单个字符与数字
r'''
.       匹配除换行符以外的任意字符
[0123456789] []是字符集合,表示匹配方括号中所包含的任意一个字符
[good]   匹配good中任意一个字符
[a-z]    匹配任意小写字母
[A-Z]    匹配任意大写字母
[0-9]   匹配任意数字
[0-9a-zA-Z] 匹配任意的数字和字母
[0-9a-zA-Z_]匹配任意的数字,字母以及下划线
[^good]     匹配除了good这几个字母以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符
[^0-9]      匹配所有的非数字字符
\d          匹配数字,效果同[0-9]
\D          匹配非数字字符,效果同[^0-9]
\w          匹配数字,字母和下划线,效果同[0-9a-zA-Z_]
\W          匹配非数字,字母和下划线,效果同[^0-9a-zA-Z_]
\s          匹配任意的空白符(空格、回车、换行、制表、换页),效果同[\r\n\t\f]
\S          匹配任意的非空白符,效果同[^\f\n\r\t]
'''
print(re.findall("\d","you are good1 man"))r'''
^   首行匹配,和在[]里的^不是一个意思
$  行尾匹配
\A  匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会匹配它行的行首
\Z  匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结束,即使在re.M模式下也会匹配它行的行尾\b  匹配一个单词的边界,也就是指单词和空格的位置'er\b'可以匹配never,不能匹配nerve\B  匹配非单词边界
'''
print(re.search("^good","you are a good man"))
print(re.search("man$","you are a good man"))print(re.search("^good","you are a good man",re.M))
print(re.search("\Agood","you are a good man",re.M))
print(re.search("man$","you are a good man",re.M))
print(re.search("man\Z","you are a good man",re.M))print(re.search(r"er\b","never"))
print(re.search(r"er\b","neve"))print(re.search(r"er\B","never"))
print(re.search(r"er\B","neve"))
'''
说明:下方的x,y均为假设的普通字符,n,m(非负整数),不是正则表达式的元字符
(xyz)   匹配小括号内的xyz(作为一个整体去匹配)
x?      匹配0个或者1个x
x*      匹配0个或者任意多个x(.*表示匹配0个或者任意多个字符(换行符除外))
x+      匹配至少一个x
x{n}    匹配确定的n个x(n是一个非负整数)
x{n,}   匹配至少n个x
x{n,m}  匹配至少n个最多m个x,注意n<=m
x|y     |表示或,匹配的是x或y
'''print(re.findall(r"a?","aaa"))#非贪婪匹配,尽可能少的匹配
print(re.findall(r"a*","aaabaa"))#贪婪匹配,尽可能多的匹配print(re.findall(r"a+","aaabaaaa"))#贪婪匹配,尽可能多的匹配
print(re.findall(r"a{3}","aaabaaaa"))
print(re.findall(r"a{3,}","aaabaaaa"))#贪婪匹配,尽可能多的匹配
print(re.findall(r"a{3,6}","aaabaaaa"))
print(re.findall(r"(a|A)n","anaabaaaAn"))

需求:提取:you…man

str1 = "you are a good man,you are a nice man ,you are a great man,you are a..."
print(re.findall(r"you.*?man",str1))'''
*?  +?  x? 最小匹配,通常都是尽可能多的匹配,可以使用这种贪婪匹配(?:x) 类似于(xyz),但是不表示一个组
'''
#注释:/* part1 */ /* part2 */
print(re.findall(r"/*.*?/*/",r"/* part1 */ /* part2 */"))

re模块中常用的功能函数

complie()

编译正则表达式模式,返回一个对象模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样做的目的为了提高一点效率)

格式:

re.complie(pattern,flags=0)

pattern:编译时用的表达式字符串

flags:编译标志位,用于修改正则表达式的匹配方式,如是否区分大小写,多行匹配等等。

import re
tt = "Tina is a good girl, she is cool, clever, and so on..."
rr = re.compile(r'\w*oo\w*')
print(rr.findall(tt))   #查找所有包含'oo'的单词#执行结果如下:
#['good', 'cool']
match()

决定re是否在字符串的开始的位置进行匹配

注意:这个方法并不是完全匹配,当pattern结束时若string还有剩余字符,仍然视为匹配成功

想要完全匹配可以在表达式末尾添加边界匹配符“$”

语法:

re.match(pattern,string,flags=0)

import re
print(re.match("com","comww.rnfregcoomn").group())
print(re.match("com",'Comwww.runcomoob',re.I).group())
search()函数

语法:

re.search(pattern,string,flags= 0)

re.search函数会在字符串中查找模式匹配,只要找到第一个匹配然后返回,若没有找到匹配则返回None

import re
print(re.search('\dcom','www.4comrunoob.5com').group())
#执行结果如下:
#4com
findall()

re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表

语法:

re.findall(pattern,string,flag=0)

import re
p = re.compile(r"\d+")
print(p.findall('o1n2m3k4'))
#执行结果如下:
#['1', '2', '3', '4']
import re
tt = "Tina is a good girl, she is cool, clever, and so on..."
rr = re.compile(r'\w*oo\w*')
print(rr.findall(tt))
print(re.findall(r'(\w)*oo(\w)',tt))#()表示子表达式
#执行结果如下:
#['good', 'cool']
#[('g', 'd'), ('c', 'l')]
finditer()

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器,找到RE匹配的所有子串,并把他们作为一个迭代器返回。

语法:

re.finditer(pattern,string,flags=0)

import re
iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...')
for i in iter:#print(i)#print(i.group())print(i.span())
"""
执行结果如下:
<_sre.SRE_Match object; span=(0, 2), match='12'>
12
(0, 2)
<_sre.SRE_Match object; span=(8, 10), match='44'>
44
split()

按照能够匹配子串将string分割后返回列表

可以使用re.split来分割字符串。

语法:

re.split(pattern,string[,maxsplit])

maxsplit用于指定最大的分割次数,若不指定则全部分割。

import re
print(re.split('\d+','one1two2three3four4five5'))
#执行结果如下:
#['one', 'two', 'three', 'four', 'five', '']
sub()

使用re替换string中每一个匹配的子串后返回替换后的新串。

语法:

re.sub(pattern,repl,string,count)

参数一:要匹配的字符串,参数二:要替换的字符串

参数三:要匹配的内容 参数四:指定替换的个数

import re
text = "Bob is a handsome boy, he is cool, clever, and so on..."
print(re.sub(r'\s+', '-', text))
#执行结果如下:
#JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on...
#其中第二个函数是替换后的字符串;本例中为'-'#第四个参数指替换个数。默认为0,表示每个匹配项都替换。

注意:

1.re.match() 与re.search()还有re.findall()区别

re.match只匹配字符串的开始,re.search匹配整个字符串,返回第一个匹配结果,re.findall整个字符串,返回所有的匹配结果。

python基础之排列组合以及正则表达式相关推荐

  1. python 排列组合算法_基于python快速实现排列组合算法

    1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍. 2.一个列表数据任意组合 2.1主要是利用自带的库#_*_ coding:utf-8 _*_ #__author__= ...

  2. C++基础数论————排列组合

    排列组合的定义: 排列就是从n个数中找出m个进行排列,共有多少种方案? 这一定要考虑顺序. 公式就是: 而组合就从从n个数中找出m个进行组合,共有多少种方案? 这一定不要考虑顺序. 公式就是: 现在, ...

  3. Python基础篇(九)-- 正则表达式

    正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了,否则,该字符串就是不合法的. 1 ...

  4. python排列组合问题_回溯问题Python框架总结——排列组合问题

    本文是对leetcode回溯题的一些模板进行整理总结,很多关于回溯的blog都会引用对回溯算法的official definition和通用的解题步骤,如果是真的想研究这一算法思想,按照这样的方式来完 ...

  5. python基础学习(三)--正则表达式

    正则表达式基础 一:+ .*  .?的用法 xiao+ye,+ 号前面的字符出现1次或多次,如可匹配xiaoye,xiaoooooye; xiao*ye,* 号前面的字符出现0次.1次或多次,如可匹配 ...

  6. python 穷举 排列组合

    python def f(n):x = [ [e] for e in range(3)]if n==1:return xr = []for i in x:for j in f(n-1):# print ...

  7. python输出字符串排列组合代码

    import re z = ["啊","阿","埃","挨","哎","唉",& ...

  8. python计算组合数_Python实现的排列组合计算操作示例

    Python实现的排列组合计算操作示例 本文实例讲述了Python实现的排列组合计算操作.分享给大家供大家参考,具体如下: 1. 调用 scipy 计算排列组合的具体数值 >> from ...

  9. python 排列组合_python 编写排列组合

    python在编写排列组合是会用到 itertools 模块 排列 import itertools mylist= list(itertools.permutations(['A','B','C', ...

  10. python编写排列组合,密码生产功能

    python编写排列组合 python在编写排列组合是会用到  itertools 模块 排列 import itertools mylist = list(itertools.permutation ...

最新文章

  1. 【MySQL】数据安全性讨论思维导图
  2. Windows 10 不能安装更新 (0x8024402f)
  3. C语言关于signal()函数
  4. OpenGL 几何着色器Geometry Shader
  5. 吴恩达机器学习笔记(二) —— Logistic回归
  6. python mysql 写入_python如何写进MYSQL
  7. ctfshow-WEB-web9( MD5加密漏洞绕过)
  8. Leetcode 256.粉刷房子
  9. WebService技术入门
  10. 51单片机-温度PID算法(C程序)
  11. c语言程序设计卡特兰数问题,求解圆上2N个点的连线问题(卡特兰数)
  12. 计算机五笔打字口诀,电脑五笔打字的字根口诀是什么?
  13. Hadoop数字统计
  14. java倒叙遍历list
  15. 七牛云 转码_七牛云视频在线转码 - 持久化处理
  16. 考研英语作文—谋篇布局
  17. 微信小程序实战 wx.showNavigationBarLoading(),下拉动画配置无效
  18. 你应该知道的6个GameFi机制
  19. 【Vue】解决 Vue 视图不刷新和组件循环引用不加载问题
  20. [BZOJ]1071: [SCOI2007]组队 STL优先队列

热门文章

  1. WIN10系统蓝屏解决方法
  2. Apache配置反向代理
  3. mingw32 编译 fastdb
  4. 全文检索同时高亮多个字段
  5. 孩子必听的数学家故事——笛卡尔
  6. 若干个数据首尾相连,构成一个圆环,找到连续的4个数之和最大的一段。
  7. pytorch dataloader参数解析
  8. LeetCode 592
  9. 入门易精通难的Unity要如何学
  10. python爬虫二十三:使用fiddler抓取app数据(三)