学习目标:
python学习一、
学习内容:
1、正则基础认识
2、re模块、切分字符串、分组、贪婪匹配、编译
3、正则的例题
1、正则基础认识
- 正则表达式是对字符串操作的一种逻辑公式,对字符串的一种过滤逻辑
- 常见字符:
?:代表前面的字符最多只可以出现一次(0次、或1次)
?:当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的
*:代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)
^:为匹配输入字符串的开始位置
$:为匹配输入字符串的结束位置
+:代表前面的字符必须至少出现一次
i:标记指定不区分大小写
g:指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配,全局匹配
m:多行匹配使边界字符 ^ 和 $ 匹配每一行的开头和结尾
- 普通字符:
[.. ]:匹配 [...] 中的所有字符
[^ ] :匹配除了 [...] 中字符的所有字符
[a-z]:表示一个区间,表示a到z的所有小写字母
\d\D:\d匹配一个数字,\D匹配一个非数字
\s\S:\s匹配所有空白符包括换行,\s匹配所有非空白符包括换行
\w\W:\w匹配字母、数字、下划线,等价于 [A-Za-z0-9_],\W匹配非数字字母下划线
.:小点匹配除换行符(\n、\r)之外的任何单个字符
- 非打印字符:
\cx:匹配由x指明的控制字符
\f:匹配一个换页符
\n:匹配一个换行符
\r:匹配一个回车符
\t:匹配一个制表符
\v:匹配一个垂直制表符
- 特殊字符:
( ):标记一个子表达式开始和结束的位置,要匹配这些字符,使用 \( \)
[:标记一个中括号表达式的开始,要匹配 [,请使用 \[
?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符,要匹配?使用\?
\:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
^:匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合
{:标记限定符表达式的开始
|:或,指明选择两项中的一个
- 限定字符:
{n}:确定匹配需要的内容几次,n为非负整数
{n,}:确定匹配需要内容n到无穷次,n为非负整数
{n,m}:m 和 n 均为非负整数,其中n <= m,最少匹配 n 次且最多匹配 m 次
- 定位字符:
\b:匹配一个单词边界,即字与空格间的位置 eg:/ter\b/可以匹配Chapter 中的字符串 ter
\B:非单词边界匹配
- 要做更精确地匹配,可以用[ ]表示范围
>-[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线
>-[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等
>-[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量
>-[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)
>-A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。 ^表示行的开头,^\d表示必须以数字开头
>-$表示行的结束,\d$表示必须以数字结束
re模块、切分字符串、分组、贪婪匹配、编译
1、re模块
Python提供re模块,包含所有正则表达式的功,同时注意python中也含有\转义
r前缀,就不用考虑转义的问题
match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None
常见的判断方法:
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print('ok')
else:
print('failed')
2、切分字符串
正则表达式切分字符串比用固定的字符更灵活
import re
print(re.split(r'[\s\,]+', 'a,b, c d'))
print(re.split(r'[\s\,\;]+', 'a,b;; c d'))
3、分组
()表示的就是要提取的分组(Group)
import re
m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
print(m.group(0))
print(m.group(1))
print(m.group(2))
4、贪婪匹配
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符
\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配
impor re
re.match(r'^(\d+?)(0*)$', '102300').groups()
输出:
('1023', '00')
5、编译
Python中使用正则表达式时,re模块内部会干两件事情:
- 编译正则表达式,如果正则表达式的字符串本身不合法,会报错;
- 用编译后的正则表达式去匹配字符串
import re
re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
print(re_telephone.match('010-12345').groups())
print(re_telephone.match('010-8086').groups())
输出:
('010', '12345')
('010', '8086')
3、正则的例题
例题一、
import re
hello = 'sdfdsldhd方法z[[发给g]js]""dSDlg__56S&(""3^*&^*4HGFDS34jsl)2523zg'
demo = re.compile('',re.S)
lists = demo.findall(hello)
print(lists)
1、匹配hello中的汉字
demo = re.compile('hd(\W+)z\[\[(\W+)g\]',re.S)
demo = re.compile('hd(.*?)z\[\[(.*?)g\]',re.S)
demo = re.compile('[\u4e00-\u9fa5]+',re.S)
2、匹配数字
demo = re.compile('[\d]+',re.S)
demo = re.compile('\d+',re.S)
demo = re.compile('[0-9]+',re.S)
demo = re.compile('[0-9]{1,}',re.S)
3、匹配小写字母
demo = re.compile('[a-z]{1,}',re.S)
demo = re.compile('[a-z]+',re.S)
4、匹配数字加大写字母
demo = re.compile('[0-9 A-Z]+',re.S)
demo = re.compile('[0-9 A-Z]{1,}',re.S)
5、获取(后面的东西
demo = re.compile('56S\&\((.*)',re.S)
6、获取方括号里面的内容
demo = re.compile('\[(\w+)\]',re.S)
demo = re.compile('z\[(.*?)\]"',re.S)
7、获取特殊字符
demo = re.compile('[^\w]+',re.S)
demo = re.compile('\W+',re.S)
demo = re.compile('[^0-9 A-Z a-z _ \u4e00-\u9fa5]+',re.S)
8、获取两个以上的字母
demo = re.compile('[a-z A-Z]{2,}',re.S)
9、获取()里面的东西
demo = re.compile('\((.*)\)',re.S)
例题二、
import re
hello = str('<li><p class="ul1">[玄幻小说]《<a class="poptext" href="https://www.23wxc.com/book/977/" title="九天剑主txt下载" target="_blank">九天剑主</a>》</p><p class="ul2"><a href="https://www.23wxc.com/0/977/90728227.html" title="第两千两百九十九章 你就这点力气?" target="_blank">第两千两百九十九章 你就这点力气?</a></p><p>火神</p>20-11-05</li>')
demo = re.compile('title="(\w+) (\w+\?)"',re.S)
lists = demo.findall(hello)
print(lists)
1、匹配第一个“玄幻小说”几个字
demo = re.compile('\[(\W+)\]',re.S)
demo = re.compile('\[(.*)\]',re.S)
2、匹配第一个977
demo = re.compile('book\/(\w+)\/',re.S)
demo = re.compile('book\/(\d+)\/',re.S)
demo = re.compile('book\/(.*?)\/',re.S)
demo = re.compile('book\/(.*)\/\" title',re.S)
3、匹配第一个“九天剑主”
demo = re.compile('title\=\"(.*)txt下载',re.S)
demo = re.compile('title\=\"(\W*)txt下载',re.S)
demo = re.compile('title\=\"(\W+)txt下载',re.S)
4、匹配最后的时间
demo = re.compile('火神\<\/p\>(.*)\<',re.S)
demo = re.compile('(\d+-\d+-\d+)',re.S)
demo = re.compile('火神\<\/p\>(\d+-\d+-\d+)\<',re.S)
demo = re.compile('[0-9]+\-[0-9]+\-[0-9]+',re.S)
5、分别匹配章节和章节名
demo = re.compile('title="(\w+) (\w+\?)"',re.S)
demo = re.compile('html" title="(.*?) (.*?)" target="\_blank"\>第两千',re.S)
例题三、
- 将字符串的大写字母替换成‘1’,‘?’是把每个大写字母当成一个整体,否则全体大写字母会被替换成一个1
strs = 'sdfasdfasdfsdaQ#$#@$awawerASDFASDF '
a = re.sub('[A-Z]+?', '1', strs)
print(a)
输出:
sdfasdfasdfsda1#$#@$awawer11111111