python学习Day26--正则表达式2+re模块+random模块

【知识点】

1、转义符:

  在python中,从正则表达到打印 :r '\n'   r ' '

  ( ——表示匹配小括号          [ ( )+*?/$. ]——在字符组中一些特殊字符会现原形

2、re 模块

  (1)字符串(匹配)

  ① findall(★★★★★)

1 import re
2 
3 ret=re.findall('d','snfe2462rcn453')
4 print(ret)  # ['2', '4', '6', '2', '4', '5', '3']
5 # 参数:先写正则表达,在写字符串
6 # 返回值类型:列表
7 # 返回值个数:1个
8 # 返回值内容:所有匹配上的项

  ② search(★★★★★)

 1 import re
 2 
 3 ret2=re.search('d+','snfe2462rcn453')
 4 print(ret2) # <_sre.SRE_Match object; span=(4, 8), match='2462'>
 5 print(type(ret2)) # <class '_sre.SRE_Match'>
 6 print(ret2.group()) # 2462
 7 
 8 ret3=re.search('s+','snfe2462rcn453')
 9 print(ret3) # None
10 
11 # 参数:先写正则表达,在写字符串
12 # 返回值类型:正则匹配结果的对象
13 # 返回值个数:1个  如果匹配上了就返回对象,没有就返回None
14 # 返回值内容:返回的对象通过group()来获取匹配到的第一个结果

  ③ match(★★):只从头开始匹配。(可以通过search实现,在search正则表达式前加^)

1 import re
2 
3 ret4=re.match('d+','123snfe2462rcn453')
4 print(ret4) # <_sre.SRE_Match object; span=(0, 3), match='123'>
5 ret5=re.match('d+','snfe2462rcn453')
6 print(ret5) # None

  (2)替换——replace

  ① sub(★★★)

 1 import re
 2 
 3 ret1=re.sub('d','H','replace1234')
 4 print(ret1)  # replaceHHHH
 5 
 6 ret2=re.sub('d','H','replace1234',2)
 7 print(ret2)  # replaceHH34
 8 
 9 ret3=re.sub('d+','H','replace1234gerrwrc456')
10 print(ret3)  # replaceHgerrwrcH
11 
12 ret4=re.sub('d+','H','replace1234gerrwrc456',1)
13 print(ret4)  # replaceHgerrwrc456

  ② subn

1 import re
2 
3 ret1=re.subn('d+','H','replace1234dfseg234')
4 print(ret1)  # ('replaceHdfsegH', 2)  返回元组,并显示替换的次数

  (3)切割

  ① split(★★★)

1 import re
2 
3 ret1=re.split('d+','alex83egon20taibai40')
4 print(ret1)  # ['alex', 'egon', 'taibai', '']

  (4)进阶方法——爬虫自动化开发

  ① compile(★★★★★):预编译

1 import re
2 
3 ret1=re.compile('-0.d+|-[1-9]d+(.d+)?')  # 预编译
4 ret2=ret1.search('rfnc-20n rrn-40eb')
5 print(ret2.group()) # -20
6 # 节省优点:只有在多次使用某一个人相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

  ② finditer(★★★★★):空效率

1 import re
2 
3 ret=re.finditer('d','jsgerk455fjkn2255vyv445')
4 for r in ret:
5     print(r.group())  # 迭代出拿到的每一个数字

3、正则表达式和python的re模块

 (1)python中的正则表达式的两个坑

  ① findall——会优先显示分组中匹配的内容,要想取消分组优先显示:(?:正则表达式)

 1 import re
 2 
 3 ret=re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com')
 4 print(ret)  # ['www.oldboy.com']
 5 
 6 ret1=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
 7 print(ret1) # ['oldboy']  (优先显示)
 8 
 9 ret2=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
10 print(ret2) # ['www.oldboy.com'] (取消分组优先显示)
11 
12 # 举例:
13 ret3=re.findall('-0.d+|-[1-9]d*(.d+)?','-1ffsdcsv-200')
14 print(ret3)  # ['', ''] 因为-1与-200均以被前面的匹配,而分组的没有匹配上,就出现了空
15 
16 ret4=re.findall('-0.d+|-[1-9]d*(?:.d+)?','-1ffsdcsv-200')
17 print(ret4)   # ['-1', '-200']  取消了分组优先显示

  ② split——遇到分组,会保留分组内被切掉的内容在列表中

1 import re
2 
3 ret1=re.split('(d+)','alex83egon20taibai40')
4 print(ret1)  # ['alex', '83', 'egon', '20', 'taibai', '40', '']

  (2)分组遇见search——如果search中有分组的话,通过group(n)就能够拿到group中匹配的内容

1 import re
2 
3 ret=re.search('d+(.d+)(.d+)(.d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))')
4 print(ret.group())  # 1.2.3.4
5 print(ret.group(1)) # .2
6 print(ret.group(2)) # .3
7 print(ret.group(3)) # .4

  分组练习:

1 # 举例:
2 import re
3 
4 ret=re.findall(r'd+(?:.d+)|(d+)','1-2*(60+(-40.35/5)-(-1*3))')
5 ret.remove('')
6 print(ret)  # ['1', '2', '60', '5', '1', '3']
1 # 举例2:
2 ret1=re.search('<(w+)>(w+)</(w+)>','<a>wahaha</a>')
3 print(ret1)
4 print(ret1.group(1)) # a
5 print(ret1.group(2)) # wahaha
6 print(ret1.group(3)) # a

  (3)分组命名(进阶)

    就上述例2,<a>wahaha</a>前后都是a,这就涉及到了分组命名了。

     ①(?P<name>正则表达式)表示给分组起名字,

         (?P=name)表示使用这个分组,这里匹配都的内容应该和分组中的内容完全相同。

    ②  通过索引使用分组

      1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全一致

 1 import re
 2 
 3 # 写法一 ?P<name>   ?P=name
 4 ret1=re.search('<(?P<name>w+)>w+</(?P=name)>','<a>wahaha</a>')
 5 print(ret1.group())  # <a>wahaha</a>
 6 print(ret1.group('name')) # a  通过名字获取
 7 
 8 # 写法二  采用索引1
 9 ret1=re.search(r'<(w+)>w+</(1)>','<a>wahaha</a>')
10 print(ret1.group())  # <a>wahaha</a>

  (4)flags有多种可选值

    re.I(IGNORECASE) 忽略大小写,括号内是完整的写法

    re.M(MULTILINE) 多行模式,改变^和$的行为

    re.S(DOTALL) 点可以匹配任意字符,包括换行符

4、random模块

  (1)随机小数:

  random.random()——0~1内的随机小数

  random.uniform(1,5)——任意范围之类的随机小数

  (2)随机整数(★★★★★)

  random.randint(1,2)——[1,2] 包含2在内的范围内的随机整数

  random.randrange(1,2)——[1,2) 不包含2在内的范围内的随机整数

  random.randrange(1,10,2)——[1,10) 不包含10在内的范围内随机取奇数

  (3)随机抽取

  random.choice()——随机抽取一个值

1 import random
2 
3 lst=[1,2,3,'aaa',('wahaha','qqxing')]
4 print(random.choice(lst))

  random.sample(lst,n)——随机抽取n个值

  (4)打乱顺序

  random.shuffle(lst)——随机打乱原列表的元素顺序

random模块练习:

 1 # 6位数字/数字-字母
 2 import random
 3 
 4 def rand_code(n=6,alph_flag=True):
 5     code=''
 6     for i in range(n):
 7         rand_num=random.randint(0,9)
 8         if alph_flag:
 9             rand_alpa=chr(random.randint(97,122))
10             rand_alpa_upper=chr(random.randint(65,90))
11             rand_num=random.choice([rand_num,rand_alpa,rand_alpa_upper])
12         code+=str(rand_num)
13     return code
14 ret=rand_code(alph_flag=False)
15 print(ret)

【注】正则表达式的参考书:正则指引(python)


时间:2020-02-19     23:27:44

原文地址:https://www.cnblogs.com/fengxb1213/p/12332584.html