正则的基础认识(re模块、切分字符串、分组、贪婪匹配、编译)和例题练习

学习目标:

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 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值