python 06.13

1.re模块

主要用来从字符串(文本)里找特定的东西。

import re
s = '孙悟空找猪八戒找媳妇妇妇高$$$$$@@@@翠兰,然____后asdfasdf吃西瓜234234瓜,再吃   西瓜'
res = re.findall('西瓜',s)
print(res)
res =re.findall('^孙悟空',s) # ^称作元字符,具有特殊的意义,从开头开始匹配
print(res)
res = re.findall('西瓜$',s) # $从结尾开始匹配,若匹配不到则为空
print(res) 
res =re.findall('孙悟空|猪八戒',s) # |相当于or
print(res) 
res = re.findall("[a,s,d]",s)  # []匹配[]中的所有元素
print(res)
res = re.findall('媳妇...',s) # .匹配任意一个字符
print(res)
res = re.findall('媳妇{5}',s) # {3}大括号前面的字符匹配3次
print(res)
res = re.findall('媳妇*',s) # *前面的字符匹配无穷个[0,∞)
print(res)
res = re.findall('媳妇+',s) # +前面的字符匹配[1,∞)
print(res)
res = re.findall('媳妇?',s) # ?前面的字符匹配[0,1]
print(res)
res = re.findall('媳妇\d+',s) # \d匹配数字
print(res)
res = re.findall('媳妇\D+',s) # \D匹配除数字以外的数据
print(res)
res = re.findall('\s+',s) # \s空
print(res)
res = re.findall('\S+',s) # \S非空
print(res)
res = re.findall('\w+',s) # \w字母、数字、下划线
print(res)
res = re.findall('\W+',s) # \W非字母、数字、下划线
print(res)

贪婪模式与非贪婪模式

# 贪婪模式
#找到继续找,直到找完这串字符串
s = '孙悟空找猪八戒找媳妇妇妇高$$$$$@@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇'
res = re.findall('猪.*妇',s)
print(res)

# 非贪婪模式
* ?就是停止符,找到一个就停止
s = '孙悟空找猪八戒找媳妇妇妇高$$$$$@@@@翠兰,然____后asdfasdf吃西234234瓜,再吃   西瓜妇'
res = re.findall('猪.*?妇',s)
res
#re模块高级用法
import re
phone_compile = re.compile('1\d{10}')
email_compile = re.compile('\w+@\w+.\w+')
test_s = '12345678900  nickchen121@163.com  2287273393@qq.com'
res = phone_compile.findall(test_s)
print(res)
res = email_compile.findall(test_s)
print(res)

# **分组,把需要的东西括号起来就行了,括号外的就不打印了
s = '猪八戒的媳妇是高翠兰,孙悟空的媳妇是白骨精,唐僧的媳妇是女儿国王,沙悟净没有媳妇(py9的学生们)'
res = re.findall('(.*?)的媳妇是(.*?)(,)',s)
print(res)

# re.split()
#* 就是字符串的split方法,区别是可以使用正则表达式去替换
s = '猪八戒的媳妇是1高翠兰,孙悟空的媳妇是2白骨精,唐僧的媳妇是3女儿国王,沙悟净没有媳妇(py9的学生们)'
print(s.split(','))
res = re.split('\d+',s)
print(res)

match 和search

match从头开始匹配找第一个,search搜索所有找一个

import re
s = '猪八戒找媳妇猪八戒'
match_res = re.match('猪八戒',s)  # 从开头开始匹配,取一个
print(match_res.group())
search_res = re.search('猪八戒',s)  # 搜索一个
print(search_res.group())

2.typing模块

  1. 类型检查,防止运行时出现参数和返回值类型不符合。
  2. 作为开发文档附加说明,方便使用者调用时传入和返回参数类型。
  3. 该模块加入后并不会影响程序的运行,不会报正式的错误,只有提醒。
  • 注意:typing模块只有在python3.5以上的版本中才可以使用,pycharm目前支持typing检查
from typing import List, Tuple, Dict
def add(a: int, string: str, f: float,
        b: bool) -> Tuple[List, Tuple, Dict, bool]:
    list1 = list(range(a))
    tup = (string, string, string)
    d = {"a": f}
    bl = b
    return list1, tup, d, bl
print(add(5, "hhhh", 2.3, False))

3.简单爬虫项目应用

import re
import requests

response = requests.get('http://www.gov.cn/premier/index.htm')
data = response.text

res = re.findall('href="(/\w+/\w+_yp.htm)"', data)  # ()只取括号内的
yp_res = 'http://www.gov.cn' + res[0]

yp_response = requests.get(yp_res)
yp_data = yp_response.text

res = re.findall('<a href="(.*?)"', yp_data)
count = 0
for url in res:
    if url == 'javascript:;':
        continue
    mp3_url = 'http://www.gov.cn' + url

    mp3_response = requests.get(mp3_url)
    mp3_response.encoding = 'utf8'  # 改变网址的utf8
    mp3_data = mp3_response.text
    # print(mp3_data)

    res = re.findall('<title>(.*?)</title>|data-src="(.*?)"',mp3_data)
    title = res[0][0]
    mp3_url = res[1][1]
    if res[1][1].startswith('/home'):
        continue

    res_response = requests.get(mp3_url)
    mp3_data = res_response.content  # MP3的二进制形式

    with open(f'{title}.mp3','wb') as fw:
        fw.write(mp3_data)
        fw.flush()
    count += 1
    print(f'{count}')
posted @ 2019-06-13 19:54  海森t  阅读(69)  评论(0)    收藏  举报