在我看来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
未完待续…