zoukankan      html  css  js  c++  java
  • python基础一 day18 认识正则表达式及探索

           

    只和字符串有关系

     

     

     

     带上大写就是非

    [Ww]什么都能匹配上

            匹配结尾

     

     

     

     

     先规则在量词,量词只约束它紧跟着的规则

    import re
    # findall
    # search
    # match
    
    # ret = re.findall('[a-z]+', 'eva egon yuan')
    #     # 返回所有满足匹配条件的结果,放在列表里
    # print(ret)
    
    # ret = re.search('a', 'eva egon yuan')
    # if ret:
    #     print(ret.group())
    # 从前往后,找到一个就返回,返回的变量需要调用group才能拿到结果
    # 如果没有找到,那么返回None,调用group会报错
    
    # ret = re.match('[a-z]+', 'eva egon yuan')
    # if ret:
    #     print(ret.group())
    # match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量。
    # 匹配的内容需要用group才能显示
    # 如果没匹配上,就返回None,调用group会报错
    
    # ret = re.split('[ab]', 'abcd')
    # # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    # print(ret)  # ['', '', 'cd']
    
    # ret = re.sub('d', 'H', 'eva3egon4yuan4',1)
    #将数字替换成'H',参数1表示只替换1个
    # print(ret) #evaHegon4yuan4
    
    # ret = re.subn('d', 'H', 'eva3egon4yuan4')
    # #将数字替换成'H',返回元组(替换的结果,替换了多少次)
    # print(ret)
    
    # obj = re.compile('d{3}')
    # #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    # ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    # print(ret.group())
    # ret = obj.search('abcashgjgsdghkash456eeee3wr2') #正则表达式对象调用search,参数为待匹配的字符串
    # print(ret.group())  #结果 : 123
    
    # import re
    # ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    # print(ret)  # <callable_iterator object at 0x10195f940>
    # # print(next(ret).group())  #查看第一个结果
    # # print(next(ret).group())  #查看第二个结果
    # # print([i.group() for i in ret])  #查看剩余的左右结果
    # for i in ret:
    #     print(i.group())
    
    
    import re
    # ret = re.search('^[1-9](d{14})(d{2}[0-9x])?$','110105199912122277')
    # print(ret.group())
    # print(ret.group(1))
    # print(ret.group(2))
    
    # import re
    #
    # ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    #
    # ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    # print(ret)  # ['www.oldboy.com']
    
    ret=re.split("d+","eva3egon4yuan")
    print(ret) #结果 : ['eva', 'egon', 'yuan']
    
    ret=re.split("(d+)","eva3egon4yuan")
    print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

    爬虫的例子:

    import re
    from urllib.request import urlopen
    
    def getPage(url):
        response = urlopen(url)
        return response.read().decode('utf-8')
    
    def parsePage(s):
        ret = re.findall(
            '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
           '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>',s,re.S)
        return ret
    
    def main(num):
        url = 'https://movie.douban.com/top250?start=%s&filter=' % num
        response_html = getPage(url)
        ret = parsePage(response_html)
        print(ret)
    
    count = 0
    for i in range(10):   # 10页
        main(count)
        count += 25

    # url从网页上把代码搞下来
    # bytes decode ——> utf-8 网页内容就是我的待匹配字符串
    # ret = re.findall(正则,带匹配的字符串) #ret是所有匹配到的内容组成的列表

    注意:

    1 findall的优先级查询:

    import re
    
    ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    
    ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['www.oldboy.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']
    
    #在匹配部分加上()之后所切出的结果是不同的,
    #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
    #这个在某些需要保留匹配部分的使用过程是非常重要的。

    分组(?P<id>d+) i.group("id")

    findall的分组优先,(?:d)取消分组优先

    贪婪模式:回溯算法,会一直找,直到不符合条件了,再往回找

    非贪婪模式:把?后面的第一条规则拿在手里,去找第一个符合规则的,就停

    网址:https://www.cnblogs.com/Eva-J/articles/7228075.html#_label10

  • 相关阅读:
    nginx-consul-template
    安装calico
    安装docker
    etcd集群安装
    安装consul-client+registrator
    command not found 的解决&&解释
    安装consul
    RAC环境下SCAN IP可以PING通,1521端口也可以TELNET,但是无法建立数据库连接
    Error starting daemon: error initializing graphdriver: devmapper: Device docker-thinpool is not a thin pool
    nginx+keepalived高可用
  • 原文地址:https://www.cnblogs.com/wang-tan/p/11437181.html
Copyright © 2011-2022 走看看