• 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

  • 相关阅读:
    联合主键有什么用?
    在Spring Boot中使用数据库事务
    Integer.valueOf
    Linux上安装Zookeeper以及一些注意事项
    一个开源的会议管理系统,适合初学者练手(老司机请忽略)
    一个开源的会议管理系统,适合初学者练手(老司机请忽略)
    IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)
    从高考到程序员之毕业流水帐
    Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
    Shiro中的授权问题(二)
  • 原文地址:https://www.cnblogs.com/fengxb1213/p/12332584.html
Copyright © 2020-2023  润新知