主要内容 :
1 . 正则表达式中的转义和 python中的转义符
a: 正则表达式中的转义符
'(' : 表示匹配小括号
[() + * $ . ?] 在字符组中一些特殊的字符会现出原形.
所有的d w s( t) 都表示原本的意义
[-]只有写在字符组的首位的时候表示普通的减号,写在其他位置表示范围[1-9],如果想匹配减号[1-9]
b: python中的转义符
' ' :表示转义符,赋予了n一个特别的意义 , 表示一个换行符
print('C:
ext') #这个时候
表示换行 C: 换行ext
print(r'C:
ext') #这个时候加一个r就取消转义.
2. re模块的方法
a: findall , search , match
findall : 返回值类型 : 列表 ,如果没有匹配到结果,就返回一个空的列表
import re res = re.findall('d+','serdd234asdwer89') print(res) # 参数 : 正则表达式,字符串 #返回值类型 : 列表 # 返回值的个数 : 1 ret= re.findall('s+','serdd234asdwer89') print(ret) #如果没有匹配到结果,就返回一个空的列表
serach : 返回值类型: 正则匹配结果的对象,如果没有匹配到对象,返回none
import re
re1 = re.search('d+', 'qwert123yuiop789')
print(re1)
print(re1.group())
#返回值类型 : 正则匹配结果的对象, 通过对象.group方法获取匹配到的第一个结果
re2 = re.search('s', 'qwert123yuiop789')
print(re2) #
print(re2.group())
# 如果没有匹配到对象,就会返回none , 在再执行group会报错.
match : match只有在开始位置匹配成功的话,才有返回,如果不在开始位置匹配成功的话,就返回none
import re
re1 = re.match('d+','1234qwert123')
print(re1) #在这个时候match和search是一样的
print(re1.group())
re2 = re.match('d+','wertt24')
print(re2) #只检测re是不是在字符串的开始位置匹配,如果没有,返回none
b: sub , subn , split
sub : 参数: 正则表达式, 替换被取代的内容,还可以指定被替换的次数.
import re re1 = re.sub('d+','12','12345sdf345er',1) #参数: 正则表达式, 替换被匹配的内容,还可以指定要替换的几次.
subn:参数: 正则表达式, 替换被取代的内容 ; 返回值: 返回值是一个元祖, 可以显示替换的次数
re2 = re.subn('d+','aa','3456ffff23') #参数: 正则表达式, 替换被取代的内容. # 返回值中显示替换的次数. print(re1) #12sdf345er print(re2) #('aaffffaa', 2)
split : 切割,参数 : 正则表达式,字符串.返回值:是一个列表.
import re re1 = re.split('d+','123der456yui789') # 参数 : 正则表达式,字符串 #返回值: 列表 print(re1) #['', 'der', 'yui', '']
c: complie finditer : 用于爬虫,自动化开发
complie : 编译,节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率
import re re1 = re.compile('d+.d+') re2 = re1.search('12.34.456.5') print(re2) print(re2.group())
finditer: 参数:正则表达式, 字符串 ; 返回的结果: 迭代器; 节省空间效率.
import re re1 = re.finditer('d+.d+','12.34.456.5') print(re1) #返回一个迭代器的对象 for r in re1: #r是正则匹配结果对象<_sre.SRE_Match object; span=(0, 5), match='12.34'> print(r.group())
3. 当分组遇到findall , split , search
findall: 会优先显示分组中的内容,要想取消分组优先,(?:正则表达式)
import re re1 = re.findall('d+(.d+)?','wert32tig34.12er') # 当分组遇到findall, 会显示分组里的内容. re2 = re.findall('d+(?:.d+)?','wert32tig34.12er') #当在分组里加上?:可以取消只显示分组的内容,正常显示. print(re1) #['', '.12'] print(re2) #['32', '34.12']
一道题: 显示所有的整数
# 显示所有的整数 import re ret=re.findall(r"d+(?:.d+)|(d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) ['', '', '', '.35', '', '', ''] ret.remove('') ['1', '2', '60', '', '5', '4', '3'] print(ret) ['1', '2', '60', '5', '4', '3']
split: 遇到分组 会保留分组内被切掉的内容
import re re1 = re.split('d+(w)', '21asd为sffdf') #根据21a切割, 保留分组里的内容 print(re1) #['','a', 'sd为sffdf']
search: 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容
import re re1 = re.search('d+(.d+)(.d)','ser1.23.42.89wer') print(re1) print(re1.group()) print(re1.group(1)) print(re1.group(2))
一道题:
import re ret = re.search(r'<(w+)>(w+)</(w+)>',r'<a>wahaha</b>') print(ret.group()) #<a>wahaha</b> print(ret.group(1)) #a print(ret.group(2)) #wahaha print(ret.group(3)) #b
4. 正则表达式的进阶: 分组命名
分组命名(?P<name>正则表达式) 表示给分组起名字
(?P=name): 表示使用这个分组, 这里匹配到的内容应该和分组中的内容相同
import re ret = re.search('(?P<name>w+)>w+</(?P=name)','<h1>hello</h1>') print(ret.group()) #h1>hello</h1 print(ret.group('name')) #h1
通过索引使用分组: 1 表示使用第一组匹配到的内容必须和第一组中的内容完全相同.
import re ret = re.search(r'<(w+)>w+</1>','<h1>hello</h1>') print(ret.group(1)) #h1 print(ret.group()) #h1>hello</h1
5. random模块
随机: 在某个范围内取到每一个值得概率是相等的
a : 随机小数
random.random() 0-1之内的随机小数
import random print(random.random()) #0.45057792992073786
random.uniform(1,5) 任意范围之内的随机小数
import random print(random.uniform(1,5)) #1.0981749595009709
b: 随机整数
random.randint(1,3) [1,3] 包含3在内的范围内随机取整数
import random print(random.randint(1,9)) #1-9之间随意取
random.randrange(1,3) [1,3)不包含3在内的范围内随机取整数
random.randrange(1,20,2) [1,20]20之内的范围内随机取奇数
import random print(random.randrange(1,20,2)) #1-20之间随意奇数
c: 随机抽取
随机抽取一个值 : random.choice(lst)
import random lst = [1,2,'aa',(1,3,'qq')] print(random.choice(lst))
随机抽取多个值 : random.sample(lst)
import random lst = [1,2,'aa',(1,3,'qq')] print(random.sample(lst,3)) #返回值是一个来列表
d: 打乱顺序
再原列表的基础上做乱序 random.shuffle(lst)
import random lst = [1,2,'aa',(1,3,'qq')] random.shuffle(lst) #没有返回值 print(lst)
e : 随机模块的应用:
版本1: 纯数字的验证码:
def rand_code(n=4): code = '' for i in range(n): num = random.randint(0,9) code += str(num) return code print(rand_code()) print(rand_code(6))
版本2: 包含数字和字母的验证码:
def rand_code(n=6): code = '' for i in range(n): rand_num = str(random.randint(0,9)) rand_alph = chr(random.randint(97,122)) rand_alph_upper = chr(random.randint(65,90)) atom_code = random.choice([rand_num,rand_alph,rand_alph_upper]) code += atom_code return code ret = rand_code() print(ret)
版本3 : 数字/数字和字母的验证码:
def rand_code(n=6 , alph_flag = True): code = '' for i in range(n): rand_num = str(random.randint(0,9)) if alph_flag: rand_alph = chr(random.randint(97,122)) rand_alph_upper = chr(random.randint(65,90)) rand_num = random.choice([rand_num,rand_alph,rand_alph_upper]) code += rand_num return code ret = rand_code(n = 4) print(ret)
6 collection模块
1) Counter方法: https://www.cnblogs.com/keke-xiaoxiami/p/8553076.html
Counter目的是用来跟踪出现的次数. 它是一个无序的容器类型, 以字典的键值对形式存储,其中元素作为key,计数的值作为value. 计数值可以是任意的整数.
创建counter类的四种方法:
c = Counter() # 创建一个空的Counter类 c1 = Counter('gallahad') # 从一个可iterable对象(list、tuple、dict、字符串等)创建 c2 = Counter({'a': 4, 'b': 2}) # 从一个字典对象创建 c3 = Counter(a=4, b=2) # 从一组键值对创建 print(c,c1,c2,c3) #Counter() #Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) #Counter({'a': 4, 'b': 2}) # Counter({'a': 4, 'b': 2})