一.正则表达式(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)