Python 正则表达式 对应实例 从教务处展示成绩页面的表格源代码中 获取课程、学分、成绩

在我看来re模块是一个很实用、很重要的模块,可以帮我们过滤不想要的字符。而且很灵活,越用越上瘾。

感觉我找到的教程都不太好,有的只有罗列式子,没有实例很抽象。

自己整理一下,方便自己看,也供大家参考。

目前还未整理完,也没有按顺序,只是个开始。

传送门:
re.sub 过滤/去除指定内容
re.findall 找到想要的内容

re.sub函数:

re.sub(正则匹配表达式,匹配后要替换的字符,原字符串)

正则匹配表达式:r’[填入以下式子]’
匹配数字\d
非数字\D
非标点符号\w
标点符号\W
汉字\u4e00-\u9fa5
任意单个字符直接写单个字符

如果只用一个条件,可以不加列表[],即:r’\d’ 跟r’[\d]’ 效果是一样的

但匹配汉字要加,即:r’[\u4e00-\u9fa5]’
所以建议直接加上[]。

匹配多个条件,我既匹配数字,又要汉字的话,用逗号隔开就好。
r’[ \d, \u4e00-\u9fa5 ]’

其实r可加可不加!自己删掉试试?

示例:

import re

#原字符串
string = "hello world! I'm glad to see you here. This is 404detecitve. 你好,世界!我很高兴在这见到你。"

#匹配e,替换为E。
replacedString = re.sub(r'[a]', "A", string)

#输出:hEllo world! I'm glad to sEE you hErE. This is 404dEtEcitvE. 你好,世界!我很高兴在这见到你。

#匹配汉字,替换为空(删除)。
replacedString = re.sub(r'[\u4e00-\u9fa5]', "", string)
#输出:hello world! I'm glad to see you here. This is 404detecitve. ,!。

#匹配标点符号,替换为空格。(注意' '里面有空格,跟上面不一样!)
replacedString = re.sub(r'[\W]', " ", string)
#输出:hello world  I m glad to see you here  This is 404detecitve  你好 世界 我很高兴在这见到你

print("replacedString = ", replacedString) 

re.findall函数:

re.findall(正则匹配表达式,原字符串,其他修饰条件)

找到后放入列表返回

如果我们想要的东西在<>里面
<内容>
我们可以用r’<(.*?)>'来匹配它

修饰条件:含义
re.I匹配对大小写不敏感
re.S匹配包括换行在内的所有字符(把换行表示为字符\n)

示例:

r可加可不加!上面加了,下面就不加了

 string = '''<aa>12<b>23<c>34<d><e\n>
 12<
 f>23<g>34<h>'''

 No_S = re.findall('<(.*?)>',string)
 Yes_S = re.findall('<(.*?)>',string,re.S)
 
 print ('No_re.S is ' ,No_S)
 #No_re.S is  ['aa', 'b', 'c', 'd', 'g', 'h']
 !!!不加re.S只能匹配第一个\n(换行)之前的内容!!! 所以没有e

 print ('Yes_re.S is ' ,Yes_S)
 #Yes_re.S is  ['aa', 'b', 'c', 'd', 'e\n', '\nf', 'g', 'h']

取一下教务处里的成绩,我将展示成绩的页面表格部分代码copy在了记事本里。
在这里插入图片描述
通过观察我们发现了想要内容左右代码的共同之处。

代码如下:

import re

with open('re.txt','r',encoding='utf-8') as f:
    string=(f.read())
    #print(txt)
    
course=re.findall('kcmc">(.*?)</td>',string)
print ('课程为 ' ,course)

课程为  ['军事理论及训练', '大学计算机基础实验', '高等数学A1', '思想道德修养与法律基础', '马克思主义基本原理', '普通体育课1', '大学生生涯规划', '大学英语B1', '大学计算机基础', '工程制图与电气CAD']

credit=re.findall('xf">(.*?)</td>',string)
print ('学分为 ' ,credit)

学分为  ['1.0', '0.5', '5', '2', '3', '1', '0.5', '2', '1.5', '2.5']

grade=re.findall('cj">(.*?)</td>',string)
print ('成绩为 ' ,grade)

成绩为  ['95', '95', '优秀', '95', '99', '99', '90', '90', '85', '85', '93', '93', '92', '92', '99', '99', '94', '94', '93', '93']

效果如下
在这里插入图片描述
翻车了!在这里插入图片描述
还有其他带着cj’'的标签,于是经过更改(让匹配更详细即可)
在这里插入图片描述

not end
未完待续…

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值