前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python_正则_re模块

python_正则_re模块

作者头像
py3study
发布2020-01-17 13:04:30
4740
发布2020-01-17 13:04:30
举报
文章被收录于专栏:python3

正则表达式元字符:

字符匹配 :

代码语言:javascript
复制
.       :除换行符以外的任意单个字符
[]      :指定范围内字符
[^]     :指定范围外字符

次数匹配:

代码语言:javascript
复制
*       :任意次,0,1,多次
.*      :任意字符 任意次
?       :至多1次或0次
+       :至少出现1次或多次
{m}     :其前面字符出现m次
{m,n}   :其前面字符出现至少m次,至多n次
{m,}    :其前面字符出现至少m次
{,n}    :其前面字符出现至多n次 

位置锚定:

代码语言:javascript
复制
^       :匹配字符串的开头
$       :匹配字符串的末尾 

分组及引用:

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

或:

代码语言:javascript
复制
a|b     :a或者b
C|cat   :C或cat
(C|c)at :Cat或cat 

转义字符:

代码语言:javascript
复制
\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个分组的子表达式 

小练习:

判断手机号码是否合法

代码语言:javascript
复制
根据手机号码一共11位并且是只以13、14、15、17、18开头的数字:
代码语言:javascript
复制
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('不是合法的手机号码')

匹配标签

代码语言:javascript
复制
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>

爬虫练习

代码语言:javascript
复制
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

豆瓣爬电影

代码语言:javascript
复制
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

简化版

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则表达式元字符:
    • 字符匹配 :
      • 次数匹配:
        • 位置锚定:
          • 分组及引用:
            • 或:
              • 转义字符:
              • 小练习:
                • 判断手机号码是否合法
                  • 匹配标签
                    • 爬虫练习
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档