python 内置模块 正则表达式

一.正则表达式(RE):一种小型的、高度专业化的编程语言,内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。用于对str实现模糊匹配

二.普通字符:需要完全匹配

re.findall('alex','yuanaleSxalexwupeiqi')
['alex']

三.元字符: 实现模糊匹配
1.通配符:’.’,可代替任何字符(换行符除外),只能代表一个字符

ret=re.findall('a..in','helloalvin')
print(ret)#['alvin']
ret=re.findall('a...n','alvinhelloawwwn')
print(ret)#['alvin', 'awwwn']
ret=re.findall('...','alvinhelloawwwn')
print(ret)#['alv', 'inh', 'ell', 'oaw', 'wwn']

2.尖角号:’^’,以某开头,本身必须在开头

ret=re.findall('^a...n','alvinhelloawwwn')
print(ret)#['alvin']
ret=re.findall('^a...n','walvinhelloawwwn')
print(ret)#[]

3.dollar符:’$’,以某结尾,本身必须在结尾

ret=re.findall('a...n$','alvinhelloawwwn')
print(ret)#['awwwn']

4.*:按照自身前方紧挨着的字符重复,贪婪匹配[0,+oo]

ret=re.findall('abc*','abcccc')
print(ret)#['abcccc']
ret=re.findall("d*","alddddddddddddegedded")
print(ret)#['', '', 'dddddddddddd', '', '', '', 'dd', '', 'd', '']#没有也是匹配上了
ret=re.findall("alex*","alealexxxxxxxx")
print(ret)#['ale', 'alexxxxxxxx']

5.+:按照自身前方紧挨着的字符重复,贪婪匹配[1,+oo]
贪婪匹配:尽可能匹配更多

ret=re.findall('abc+','abccc')
print(ret)#['abccc']
ret=re.findall("d+","alddddddddddddegedded")
print(ret)#['dddddddddddd', 'dd', 'd']
ret=re.findall("alex+","alealexxxxxxxx")
print(ret)#['alexxxxxxxx']

6.?:按照自身前方紧挨着的字符重复,贪婪匹配[0,1]

ret=re.findall('abc?','abccc')
print(ret)#['abc']

7.*?/+?/??/{}?:将其变成惰性匹配
惰性匹配:匹配尽可能少的

ret=re.findall('abc*?','abcccccc')
print(ret)#['ab']
ret=re.findall("a.*?b","axxyyzbdkb")
print(ret)#['axxyyzb']
ret=re.findall("a.+?b","axxyyzbdkb")
print(ret)#['axxyyzb']
ret=re.findall("a.??b","axxyyzbdkb")
print(ret)#[]

8.{t}/{x,y=+oo}:自定义次数/范围匹配,双侧闭区间,贪婪匹配

ret=re.findall('abc{1,4}','abccc')   #{x, }={x,+oo}
print(ret)#['abccc']
ret=re.findall("alex{6}","falexx")
print(ret)#[]

9.[]:字符集,其中无特殊符号(-,^,/除外);只代表一个字符

ret=re.findall('a[bc]d','acd')   #指b或c
ret=re.findall('a[b,c]d','acd')   #指b或,或c
print(ret)#['acd']
ret=re.findall('[.*+]','a.cd+')
print(ret)#['.', '+']
 
ret=re.findall('[a-z]','acd32f')   #指[a,z],不包括大写
print(ret)#['a', 'c', 'd', 'f']           #[a,Z]为所有英文字母(顺序按ASCII码)
ret=re.findall('[a-z]*','acd32f')
preint(ret)#['acd', '', '', 'f', '']
ret=re.findall("[1-22222]*","13e1221")   #指[1,2]或2...重复
print(ret)#['1', '', '', '1221', '']
ret=re.findall("[1-22222]","13e1221")
print(ret)#['1', '1', '2', '2', '1']
ret=re.findall("e[1-22222]","13e1221")
print(ret)#['e1']
ret=re.findall("[1-9a-z]","13e1221")
print(ret)#['1', '3', 'e', '1', '2', '2', '1']
ret=re.findall("[1-22a-z]","13e1221")   #指[1,2]或2或[a,z]
print(ret)#['1', 'e', '1', '2', '2', '1']
 
ret=re.findall('[^ab]','45bdha3')   #指不为a或b的字符
print(ret)#['4', '5', 'd', 'h', '3']
 
ret=re.findall('[\d]','45bdha3')   #指
print(ret)#['4', '5', '3']
re.findall("\([^()]*\)","12+(34*6+2-5*(2-1))")   #\为转义符
["(2-1)"]
re.findall("\(.*\)","12+(34*6+2-5*(2-1))")
['(34*6+2-5*(2-1))']   #奇怪

10.\ :转义符,后边跟元字符去除特殊功能;跟普通字符实现特殊功能

\d  匹配任何十进制数;相当于类 [0-9]。
\D 匹配任何非数字字符;相当于类 [^0-9]。
\s  匹配任何空白字符;相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;相当于类 [^a-zA-Z0-9_ ]
\b  匹配一个特殊字符边界,比如空格 ,&,#等
ret=re.findall('I\b','I am LIST')
print(ret)#[]
#使用re模块自身语言时无问题
#\b在python层有意义,传给re模块时已经过翻译
ret=re.findall(r'I\b','I am LIST')
#r表示原生字符串(rawstring),意为字符串中内容在python层不进行转译
print(ret)#['I']
ret=re.findall('I\\b','I am LIST')
#\\表示在python层取消\的特殊意义,\\作为普通\和b传给re模块
print(ret)#['I']
ret=re.findall('c\\\\l','yu7c\l3de')=re.findall(r'c\\l','yu7c\l3de')
#用\取消\的特殊含义,传入re模块的应为c\\l
#在python层两个\分别用\取消特殊含义
print(ret)#['c\\l']   #在python从c\l转译成c\\l
ret=re.findall('www.baidu','www.baidu')
print(ret)#[]
ret=re.findall('www\.baidu','www.baidu')
print(ret)#["www.baidu"]

在这里插入图片描述
11.():分组符,()中内容作为一个整体处理

  • 当有多个分组,其中每个组第n次匹配成功的内容都被放到同1个元组中,这些元组共同构成1个列表
re.findall(r'(ad)+','add')
#['ad']
re.findall(r'(abc)+','abcabcabc')#优先显示组内匹配成功的内容
#['abc']
re.findall(r'(?:abc)+','abcabcbac')
#['abcabcabc']
re.findall(r'(abc)*','abcabcabc')
#['abc','']
re.findall(r'(abc)|(1)','abcabcabc')
#[('abc', ''), ('abc', ''), ('abc', '')]
re.findall(r'(abc)|(1)|(ab)','abcabcabc')
#[('abc', '', ''), ('abc', '', ''), ('abc', '', '')]
re.findall(r'(abc)*(1)*(a)*','abcabcabc1a')
#[('abc', '1', 'a'), ('', '', '')]
re.findall(r'(abc)+(1)+(a)+','abcabcabc1a')
#[('abc', '1', 'a')]
re.findall(r'(bc)|(de)|a','abcdeef')
#[('', ''), ('bc', ''), ('', 'de')]

12.有名分组:(’(?P< name >pattern)’,str);name可替换为任意内容,表示这个分组的名字,可通过.group(‘name’)获得这一组内容

ret=re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com')
print(ret.group())#23/com
print(ret.group('id'))#23

13.|:管道符,以|为界分为前后两部分,两部分间关系为或

ret=re.findall(r'ka|b','sdjkbsf')
print(ret)#['b']
ret=re.findall(r'ka|b','sdjka|bsf')
print(ret)#['ka','b']
ret=re.findall(r'ka|bc','sdjka|bsf')
print(ret)#['ka']
ret=re.findall(r'ka|bc','sdjka|bcsf')
print(ret)#['ka','bc']
ret=re.search('(ab)|\d','rabhdg8sd')
print(ret.group())#ab

四.常用方法
runoob.com/python3/python3-reg-expressions.html

import re
re.findall(pattern,string,pos=0,endpos=len(string)-1)    
#返回所有满足匹配条件的结果,放在列表里
#pattern为匹配的正则表达式(规则/条件);string为匹配内容;pos指定字符串的起始位置,默认为 0;endpos指定字符串的结束位置,默认为字符串的长度

re.search(pattern, string, flags=0).group()  
#函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象
#该对象可以通过调用.group()方法得到匹配的字符串,如果字符串没有匹配,返回None
#pattern/string同findall;flags为标志位,用于控制正则表达式的匹配方式,如是否区分大小写/多行匹配 

re.match(pattern, string, flags=0).group()     
#同search,不过只在字符串开始处进行匹配(在search的基础上加上^)
#参数说明同search 

re.split(pattern,string,maxsplit=0,flags=0)
#按照能够匹配的子串将字符串分割后返回列表,匹配的子串不返回
#pattern正则表达式,不可为'';string要匹配的字符串;maxsplit为最大分隔次数,默认为0,不限制次数;flags为标志位
#若一侧无内容,得到一个""
ret=re.split('[ab]','abcd')   #先按'a'分割得到''和'bcd',再对'','bcd'分别按'b'分割得到'','','cd'
print(ret)#['', '', 'cd']

re.sub(pattern, repl, string, count=0, flags=0)
#用于替换字符串中的匹配项
#pattern为正则中的模式字符串;repl为替换的字符串,也可为一个函数;string为要被查找替换的原始字符串;count为最大替换次数,默认0表示替换所有;flags为编译时用的匹配模式(数字形式)
ret=re.sub('\d','abc','alvin5yuan6',1)
print(ret)#alvinabcyuan6
re.subn(pattern,repl,string,count=0,flags=0)
#同sub,还返回匹配次数
ret=re.subn('\d','abc','alvin5yuan6')
print(ret)#('alvinabcyuanabc', 2)

re.compile(pattern,flags)
#用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match()和search()使用
#pattern为一个字符串形式的正则表达式;flags可选,表示匹配模式,如忽略大小写/多行模式
#flags参数:re.I表示忽略大小写;re.L表示特殊字符集\w, \W, \b, \B, \s, \S依赖于当前环境;re.M多行模式;re.S即为' . '并且包括换行符在内的任意字符(' . '不包括换行符);re.U表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S依赖于Unicode字符属性数据库;re.X表示为了增加可读性,忽略空格和' # '后面的注释
obj=re.compile('\d{3}')
ret=obj.search('abc123eeee1')
print(ret.group())#123
#可以使用多次

re.finditer(pattern, string, flags=0)
#同findall,只是返回的是迭代器对象
#参数说明同findall
ret=re.finditer('\d','ds3sy4784a')
print(ret)#<callable_iterator object at 0x10195f940>
next(ret).group()   #获得匹配上的字符
#减少内存占用
import re
 
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)#['oldboy']     
#findall会优先把匹配结果分组里内容返回,如果想要匹配结果,取消权限即可
 
ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')   #去除优先级
print(ret)#['www.oldboy.com']
import re

print(re.findall("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>"))
print(re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>"))
print(re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>"))
#匹配出所有的整数
import re

#ret=re.findall(r"\d+{0}]","1-2*(60+(-40.35/5)-(-4*3))")
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove("")

print(ret)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值