python_正则_re模块

发布时间:2019-05-09 22:04:21编辑:auto阅读(2051)

     

    正则表达式元字符:

    字符匹配 :

    .       :除换行符以外的任意单个字符
    []      :指定范围内字符
    [^]     :指定范围外字符

    次数匹配:

    *       :任意次,0,1,多次
    .*      :任意字符 任意次
    ?       :至多1次或0次
    +       :至少出现1次或多次
    {m}     :其前面字符出现m次
    {m,n}   :其前面字符出现至少m次,至多n次
    {m,}    :其前面字符出现至少m次
    {,n}    :其前面字符出现至多n次 

    位置锚定:

    ^       :匹配字符串的开头
    $       :匹配字符串的末尾 

    分组及引用:

    ()      :分组,括号内模式会被记录于正则表达式引擎
    后向引用 :\1  \2  \3..... 

    或:

    a|b     :a或者b
    C|cat   :C或cat
    (C|c)at :Cat或cat 

    转义字符:

    \w      :匹配字母数字
    \W      :匹配非字母数字
    \s      :匹配任意空白字符,等价于 [\t\n\r\f].
    \S      :匹配任意非空字符
    \d      :匹配任意数字,等价于 [0-9].
    \D      :匹配任意非数字
    \A      :匹配字符串开始
    \Z      :匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
    \z      :匹配字符串结束
    \G      :匹配最后匹配完成的位置。
    \b      :匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
    \B      :匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
    \n      :匹配一个换行符
    \t      :匹配一个制表符
    \1...\9 :匹配第n个分组的子表达式 

     

    小练习:

    判断手机号码是否合法

    根据手机号码一共11位并且是只以13、14、15、17、18开头的数字:
    import re
    phone_number = input('please input your phone number : ')
    if re.match('^(13|14|15|17|18)[0-9]{9}$',phone_number):
            print('是合法的手机号码')
    else:
            print('不是合法的手机号码')

    匹配标签

    import re
    
    
    ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
    #还可以在分组中利用?<name>的形式给分组起名字
    #获取的匹配结果可以直接用group('名字')拿到对应的值
    print(ret.group('tag_name'))  #结果 :h1
    print(ret.group())  #结果 :<h1>hello</h1>
    
    ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
    #如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
    #获取的匹配结果可以直接用group(序号)拿到对应的值
    print(ret.group(1))
    print(ret.group())  #结果 :<h1>hello</h1>

     

    爬虫练习

    import requests
    
    import re
    import json
    
    def getPage(url):
    
        response=requests.get(url)
        return response.text
    
    def parsePage(s):
        
        com=re.compile('<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>',re.S)
    
        ret=com.finditer(s)
        for i in ret:
            yield {
                "id":i.group("id"),
                "title":i.group("title"),
                "rating_num":i.group("rating_num"),
                "comment_num":i.group("comment_num"),
            }
    
    def main(num):
    
        url='https://movie.douban.com/top250?start=%s&filter='%num
        response_html=getPage(url)
        ret=parsePage(response_html)
        print(ret)
        f=open("move_info7","a",encoding="utf8")
    
        for obj in ret:
            print(obj)
            data=json.dumps(obj,ensure_ascii=False)
            f.write(data+"\n")
    
    if __name__ == '__main__':
        count=0
        for i in range(10):
            main(count)
            count+=25
    豆瓣爬电影

     

    import re
    import json
    from urllib.request import urlopen
    
    def getPage(url):
        response = urlopen(url)
        return response.read().decode('utf-8')
    
    def parsePage(s):
        com = re.compile(
            '<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>', re.S)
    
        ret = com.finditer(s)
        for i in ret:
            yield {
                "id": i.group("id"),
                "title": i.group("title"),
                "rating_num": i.group("rating_num"),
                "comment_num": i.group("comment_num"),
            }
    
    
    def main(num):
        url = 'https://movie.douban.com/top250?start=%s&filter=' % num
        response_html = getPage(url)
        ret = parsePage(response_html)
        print(ret)
        f = open("move_info7", "a", encoding="utf8")
    
        for obj in ret:
            print(obj)
            data = str(obj)
            f.write(data + "\n")
    
    count = 0
    for i in range(10):
        main(count)
        count += 25
    简化版

     

     

     

关键字