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)
执行结果如下: