• python全栈开发day16-正则表达式和re模块


    1.昨日内容回顾

    2.正则表达式(re模块是python中和正则表达式相关的模块)

      1.作用

        1)、输入字符串是否符合匹配条件

        2)、从大段文字中匹配出符合条件的内容

      2.字符组

        [0-9a-zA-Z]

      3.元字符(匹配个数1个)

        .   # 匹配除换行符以外的任意字符

        w   # 匹配字母、数字、下划线

                  s   # 匹配空格、回车符( )、制表符( )

        d   #匹配数字

        W   #匹配非字母、数字、下划线

        S   # 匹配非空格、回车符( )、制表符( )

        D   # 匹配非数字

            # 匹配换行符

           # 匹配制表符

           #匹配单词的结尾 例:h(以‘h’为开头),h(以‘h’为结尾)

        ab|a   #匹配ab或a,注长的放在前边。

        [...]   #匹配字符组中的字符

        [^...]   #匹配除字符组中字符以外的所有字符

        ^   #匹配字符串的开头^a

                  $   #匹配字符串的结尾a$

           4.量词

        *   #重复0次或更多次

        +   #重复0次或更多次

        ?   # 重复0次或1次

        {n}   # 重复n次

        {n,}   #重复n次或更改次

        {n,m}   #重复n次至m次

        

      5.其他

          1)、  . ^ $ 

                        

    正则

    待匹配字符

    匹配
    结果

    说明

    李[杰莲英二棍子]*

    李杰和李莲英和李二棍子

    李杰
    李莲英
    李二棍子

    表示匹配"李"字后面[杰莲英二棍子]的字符任意次

    李[^和]*

    李杰和李莲英和李二棍子

    李杰
    李莲英
    李二棍子

    表示匹配一个不是"和"的字符任意次

        2)、  * + ? { }

        3)、  分组 ()与 或 |[][^] #匹配15或18位(含x)例子

                                  ret = re.findall('[1-9]d{14}(?:d{2}[0-9x])?$', '34939489495854966234')
            print(ret)

        4)、  转义符

            在python中,无论是正则表达式,还是待匹配内容,都是字符串的形式出现,但是字符串中的也有特殊含义,本身需要转义.所以我们要匹配一次"d",我们需要写成‘\d’,

            正则表达式中要写成‘\\d’,看着不舒服,写着也不方便,在python中表示待匹配的‘d’写成r‘d’,在正则中写成r‘\d’。

        5)、  贪婪匹配和惰性匹配

                             贪婪匹配:在满足匹配时,会匹配尽可能长的的字符串,默认采用的是贪婪匹配。

           惰性匹配(?):例子.*?x,取前面任意长的字符串,直至出现x

    正则

    待匹配字符

    匹配
    结果

    说明

    <.*>

    <script>...<script>

    <script>...<script>

    默认为贪婪匹配模式,会匹配尽量长的字符串

    <.*?>

    r'd'

    <script>
    <script>

    加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

    3.re模块

        常用方法:

        1.re.findall(‘a’,‘abca’,flag=0)     # 返回所有满足匹配条件的结果,放到列表里

        2.re.search(,)         #函数会在字符串内查找模式匹配,只要找到第一个匹配就会返回包含匹配信息的对象,该对象可以通过.group()方法取回匹配的字符串,如没有匹配返回None。

                          ret = re.search('a', 'eva egon yuan').group()

          print(ret) #结果 : 'a'

        3.re.match(,)      #  和search基本相同,不过他仅在待匹配字符串开头匹配

        ret = re.match('ab', 'abcd').group()
        print(ret)

        4.re.split(’[ab]‘,'abcd')  # 按[ab]的元素进行依次分割,得到列表

           ret = re.split('[ab]','abcd')
          print(ret)
          运行结果:['', '', 'cd']

          正则表达式部分加上()和不加得出结果是不同的,加上()保留了所匹配到的项,而不加()没有保留所匹配到的项目

                          ret = re.split('(ab)','abcd')
          print(ret)
          '''  ['', '','ab', 'cd']  '''

        5.re.finditer()  # 返回一个存放匹配结果的迭代器。

        6.sub subn

                  7.编译:compile

    ret = re.finditer('d+','d123dd22ss2343')
    print(ret)
    print(next(ret).group())
    for i in ret:
        print(i.group())
       
    '''
    <callable_iterator object at 0x000000000075DD30>
    123
    22
    2343
    '''

        两个注意点:

        1 findall的优先级查询:#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

    ret = re.findall('www.(baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
    print(ret) # 含组 会优先返回组内匹配内容,显示全部匹配内容:
    ret = re.findall('www.(?:baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
    print(ret)
    '''
    ['baidu', 'cnblogs']
    ['www.baidu.com', 'www.cnblogs.com']
    '''

                   2 split的优先级查询:加()会会在结果列表中保留匹配的项

          ret=re.split("d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(d+)","eva3egon4yuan") print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之      后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。

                  3 ?号的4种用法:

          1)、量词:重复0次或一次

         2)、惰性匹配:

                      3)、分组标识:定义(?P<name> 正则表达式) 使用的时候:(?P=name)

                      4)、findall和split中:取消分组优先级

                        

    4.综合练习和扩展

      1.匹配标签:

        标签匹配的两种方式:

        1)、利用组名:

        ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
        print(ret.group())

        2)、利用组号:

         ret = re.search("<(w+)>w+</\1>","<h1>hello</h1>")
         print(ret.group())

        3)、练习

        @@@123@@@

        ###123###

    '@@@123@@@'

    '###123###'

    ret = re.search('(?P<tag_name>.+)w+(?P=tag_name)', '@@123@@@')
    print(ret.group())

      2.匹配整数

        

    View Code

      3.数字匹配

    # 1、 匹配一段文本中的每行的邮箱
    #       http://blog.csdn.net/make164492212/article/details/51656638
    #
    # 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
    ret = re.search('[1-2]d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|[3][0-1])', '1990-1-1')
    print(ret.group())


    #
    #    分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
    #    一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
    #
    # 3、 匹配qq号。(腾讯QQ号从10000开始)  [1,9][0,9]{4,}
    #
    # 4、 匹配一个浮点数。       ^(-?d+)(.d+)?$   或者  -?d+.?d*
    #
    # 5、 匹配汉字。             ^[u4e00-u9fa5]{0,}$
    ret = re.findall('^[u4e00-u9fa5]','中国人民共和国ss')
    print(ret)
    #
    # 6、 匹配出所有整数


      4.爬虫练习

      5.作业题,计算器

      实现能计算类似

      1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

    5.collections模块: 

    1、namedtuple # 生成可以用名字来访问的元素内容的元组(不能改)
      2、deque  # 双端队列 可以快速的从另一侧追加和删除元素
      3、OrderedDict # 有序字典
      4、defaultdict # 带默认值的字典
      5、Counter    # 计数器 主要用来计数。

  • 相关阅读:
    与众不同 LibreOJ
    清点人数 LibreOJ
    数星星 Stars LibreOJ
    树状数组 1 :单点修改,区间查询 Gym
    DDL与DML
    605. 种花问题
    Minimum Spanning Tree Gym
    最小生成树动态演示
    ssm框架添加分页
    ssm框架下的文件自动生成模板(简单方便)
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9067711.html
Copyright © 2020-2023  润新知