Python基础——正则表达式、re模块、股票信息采集、天气信息采集

mac2024-03-31  35

1.正则表达式的基本语法

\d     数字   

\w    字母或数字或下划线 

.      任意一位符号

\s     一个空白符号

\d{3}   三位数字

\d{3,8}  3到8位数字

\d{3,}   3位以上数字

\d+     1位以上数字

\d*     没有或任意多位数字

\d?     1位或0位数字

\d{3}\s+\d{3,8}    匹配一个电话号码 三位区号+若干个空格+3到8位市话号码

当?前面一个符号是一个固定长度的模式时,执行贪婪匹配(能匹配多长匹配多长),但是如果?前面一个符号是一个长度范围时,就低不就高。

2.re模块的用法

3.re模块的match方法

match方法只能从字符串开始的位置开始匹配,不能从字符串中间开始匹配。

如果匹配不上,返回值为空(None)

如果匹配上了,可以使用匹配对象的group方法取出匹配到的内容,也可以使用groups方法取出分组分配(在正则表达式中使用了括号)的内容。

4.re模块的search方法

Search方法可以从字符串的任意一个位置开始匹配,Match和search方法都是执行一次匹配

5.re模块的findall方法

从头匹配到尾,把所有匹配到的结果合成一个列表

常用有三种模式。re.I 忽略大小写;re.M影响^和$;re.S能够匹配换行符号

6.用re模块进行替换和切分

Sub方法可以按照正则表达式规定的模式对字符串进行替换

Split方法可以按照正则表达式规定的模式对字符串进行切割

7.股票信息采集

#获取全部股票的代码和名称 import re import requests code=re.compile(r">(.{3,6})\(([630]\d{5})\)") url="http://quote.eastmoney.com/stock_list.html" html=requests.get(url).content.decode("gbk") result=code.findall(html) print(result[:10]) def test(name): for i in result: if name in i: print(f"股票名称:{i[0]} 股票代码:{i[1]}") break price=re.compile(r"price: '\d{1,3}\.\d{1,2}'") zx=["600036","000338"] for i in zx: if i[0]=="6": url=f"http://quotes.money.163.com/0{i}.html" else: url=f"http://quotes.money.163.com/1{i}.html" htm=requests.get(url).text test(i) print(price.findall(htm)[0])

执行结果如下:

8.天气信息采集

#天气预报 import re import requests head={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}#由于存在反爬虫设施,需要取得代理useragent url="https://www.tianqi.com/xian/15/" htm=requests.get(url,headers=head).text tq=re.compile(r'<h3><b>(\d{2}月\d{2}日)</b>.+?(<em>)?(.{2,3})(</em>)?</h3>.+?<li class="temp">(.{1,5})\s+(-?\d{1,2})~<b>(-?\d{1,2})</b>℃</li>.+?<li>(.{5,7})</li>',re.S) result=tq.findall(htm) print(f"{'日期':8s}\t{'星期':8s}\t{'天气':8s}\t{'最高气温(℃)':8s}\t{'最低气温(℃)':8s}\t{'风向风速':8s}") print("-"*110) for i in result: print(f"{i[0]:8s}\t{i[2]:8s}\t{i[4]:8s}\t{i[5]:8s}\t{i[6]:8s}\t{i[7]:8s}") print("-"*110)

执行结果如下:

 

最新回复(0)