加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式:内置re模块

发布时间:2020-12-14 06:18:03 所属栏目:百科 来源:网络整理
导读:正则表达式: ?正则表达式本身是一种小型的,高度专业化的编程语言,在python中,通过内嵌集成re模块 ?可以直接调用来实现正则匹配。 ?动态的模糊匹配,存在一定的条件 ?例1: ?import re ?res = re.match("^Chen","Chen321RongHua")???#^匹配以Chen开头; ?r
正则表达式:
?正则表达式本身是一种小型的,高度专业化的编程语言,在python中,通过内嵌集成re模块
?可以直接调用来实现正则匹配。
?动态的模糊匹配,存在一定的条件

?例1:
?import re
?res = re.match("^Chen","Chen321RongHua")???#^匹配以Chen开头;
?res1 = re.match("^Chend","Chen321RongHua")??#^匹配以Chen开头,d其后为数字;
?res2 = re.match("^Chend+","Chen321RongHua")??#^匹配以Chen开头,d其后为数字, +代表一个或多个;
?print(res.group())
?print(res1.group())
?print(res2.group())?
?
?输出:
?Chen
?Chen3
?Chen321
?
?
?功能函数:
?1.?re.compile()
??编译正则表达式模式,返回一个对象模式;
??可以把那些常用的正则表达式编译成正则表达式对象,提高一点效率;
??
??格式:
??re.complile(pattern,flags=0)
??
??pattern:?编译时用的表达式字符串;
??flags:??编译标志位,用于修正表达式的匹配方式,如:是否区分大小写,多行匹配等。
??
??常用的flags有:
??re.S(DOTALL):???使 . 匹配包括换行在内的所有字符;
??re.I(IgnoreCase):??使匹配对大小写不敏感,即或略大小写
??re.L(Locale):???做本地化识别(local-aware)匹配。
??re.M(Multiline):??多行匹配,影响^和$
??re.X(Verbose):???该标志通过给与更灵活的格式以便将正则表达式写得更易于理解;
??re.U:?????根据Unicode字符集解析字符,这个标志影响w,W,b,B
??
??
??案例:
???import re
???tt = "This is a good girl,she is cool,clever,and so on....."
???rr = re.compile(r"w*oow*")
???print(rr.findall(tt))
??
???输出:[‘good‘,‘cool‘]
??
???"w"??匹配包括下划线在内的任何字符:?[A-Za-z0-9_]
???"*"???匹配前一个字符0次或多次
??
???import re
???tt = "This is a gOod girl,and so on....."
???rr = re.compile(r"w*oow*",re.I)
???print(rr.findall(tt))
???
???输出:[‘gOod‘,‘cool‘]
???
???re.I(IgnoreCase):??使匹配对大小写不敏感,即或略大小写
???
?2.?re.match()???
??从字符串的开头开始匹配,返回第一个匹配的;
??
??决定re是否在字符串刚开始的位置匹配,这个方法并不是完全匹配,当pattern结束时
??若string还有剩余字符,仍然视为成功,要想完全匹配,可以在表达式末尾加上边界匹配符号"$"
??
??格式:
??re.match(pattern,string,flags)
?
??案例:
???print(re.match("com","com www.baidu.com,www.test.Com").group())
???print(re.match("com","com www.baidu.com",re.I).group())
???print(re.match(".*com","www.baidu.com,www.test.Com").group())
???
???输出:
???com
???com
???www.baidu.com
???
??一定时要从开头开始起匹配,否则匹配不上
???
???
?3.?re.search()???
??
??从字符串的任意位置开始匹配,返回第一个匹配的;
??函数会在字符串内查找模式匹配,只要找到第一个匹配后就返回,如果字符串没有匹配,则返回None
??
??格式:
??re.search(pattern,flags)
??
??案例:
??print(re.search("com",www.test.Com").group())
??print(re.search("com","om www.baidu.Com",re.I).group())
?
??输出:
??com
??Com
?
??备注:
??match和search一旦匹配成功,就是一个match object对象,就以下方法:
??
??group():??返回被re匹配的字符串;
??start():??返回匹配的开始位置;
??end():???返回匹配的结束位置;
??span():???返回一个元组包含开始,结束的位置
??groups():??返回re整体匹配字符串,可以一次输入多个组号,对应的组号匹配的字符串
??
??案例:
??
??tt = "123abc456"
??print(re.search("([0-9]*)([a-z]*)([0-9]*)",tt).group(0))
??print(re.search("([0-9]*)([a-z]*)([0-9]*)",tt).group(1))
??print(re.search("([0-9]*)([a-z]*)([0-9]*)",tt).group(2))
??print(re.search("([0-9]*)([a-z]*)([0-9]*)",tt).group(3))
??
??输出:
??123abc456
??123
??abc
??456
??
?4.?re.findall()???
??从字符串的任意位置开始匹配,返回所有匹配的; 没有group方法。
??
??遍历匹配,可以获得字符串中所有的匹配的字符串,返回一个列表
?
??格式:
??re.findall(pattern,flags)
?
??案例:
??import re
??tt = "This is a gOod girl,and so on....."
??rr = re.compile(r"w*oow*",re.I)
??print(rr.findall(tt))
?
??输出:
??[‘gOod‘,‘cool‘]
?
?5.?re.split()
??按照能够匹配的字符串将string分割后返回列表;
??
??格式:
??re.split(pattern,string[,maxsplit])
??maxsplit 用于指定最大的分割次数,不指定全部分割
??
??
??例如:
??re.split(r"S+",string)??? 将字符串按照空格分割一个单词列表
??
??
??tt = "This is a gOod girl,and so on"
??print(re.split(r"s+",tt))
??
??输出:
??[‘This‘,‘is‘,‘a‘,‘gOod‘,‘girl,‘,‘she‘,‘cool,‘and‘,‘so‘,‘on‘]
??
??
??案例:
??>>> re.split("[0-9]","abc12efg98sdsd343ksd")
??[‘abc‘,‘‘,‘efg‘,‘sdsd‘,‘ksd‘]
??>>>
??>>> re.split("[0-9]+",‘ksd‘]
??>>>
??
??expr = "3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)"
??>>> re.split(r"(([^()]+))",expr,1)
??[‘3*‘,‘ 4+ 50 ‘,‘-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)‘]
?
?6. re.sub():
??? 使用re替换string中每一个匹配的字符串后返回匹配的字符串
??
??格式:
??
??re.sub(pattern,count)
??
??案例:
??>>> re.sub("[0-9]+","|","abc12ded87sds40hsd")
??‘abc|ded|sds|hsd‘
??>>>
??
??>>> re.sub("[0-9]+","abc12ded87sds40hsd",count=2)??#count表示需要替换的个数,不写表示替换所有
??‘abc|ded|sds40hsd‘
??>>>
?
?
?
?
?常规的正则表达式符号:?
?1.?"."? ?匹配任意除换行符"n"外的字符(在DOTALL模式中也能匹配换行符);
????>>> re.search("R.+Hua","Chen321RongHua123").group()
????‘RongHua‘
????>>> re.search("R[a-zA-Z]+a","Chen321RongHua123").group()
????‘RongHua‘
????>>>
????>>> re.search("R[a-zA-Z]+a","Chen321RongHua123RongHua").group()
????‘RongHua‘
????
????[0-9]???#表示任何数字
????[a-z]???#表示匹配任意小写字母;
????[A-Z]???#表示匹配任意大写字母;
????[a-zA-Z]??#表示匹配任意大小写字母;
???
?2.?"^"??匹配字符串开头,在多行模式中匹配每一行的开头;
?3.?"$"??匹配字符串末尾,在多行模式中匹配每一行的末尾
?4.?"*"??匹配前一个字符0次或多次
????>>> re.search("hhh*","hhello#1212")?????#至少匹配”hh"
????<_sre.SRE_Match object; span=(0,2),match=‘hh‘>
????>>>?
?5.?"+"??匹配前一个字符1次或无限次
?6.?"?"??匹配前一个字符0次或1次
????>>> re.search("hhh?",match=‘hh‘>
????>>>
?7.?"{m}"?匹配前一个字符m次,
????>>> re.search("l{2}","hhello#1212")
????<_sre.SRE_Match object; span=(3,5),match=‘ll‘>
????
????>>> re.search("[0-9]{3}","hhello#1212")
????<_sre.SRE_Match object; span=(7,10),match=‘121‘>
????>>>
????>>> re.search("[0-9]{4}",11),match=‘1212‘>
????>>> re.search("[0-9]{2}",9),match=‘12‘>
????>>>
???????
?8.?{m,n}?匹配前一个字符m至n次,若省略n,则匹配m至无限次
?
????>>> re.search("[0-9]{2,3}",match=‘121‘>
????>>>
????>>> re.search("[0-9]{4,5}",match=‘1212‘>
????>>>
????>>> re.search("[0-9]{5,6}","hhello#1212")
????>>>
????>>>
????>>> re.search("[0-9]{2,"hhello#12")
????<_sre.SRE_Match object; span=(7,match=‘12‘>
????>>>
?
????>>> re.search("[0-9]{2,"hhe2w3l3lo#12")
????<_sre.SRE_Match object; span=(11,13),match=‘12‘>
????>>>
????>>>
????>>> re.findall("[0-9]{2,"hhe2w3l3lo#12")
????[‘12‘]
????>>> re.findall("[0-9]{1,"hhe2w3l3lo#12")
????[‘2‘,‘3‘,‘12‘]
????>>>
?
?9.?"|"??或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式
????>>> re.search("abc|ABC","hhabce2w3l3lABCo#12")
????<_sre.SRE_Match object; span=(2,match=‘abc‘>
????>>>
????>>> re.findall("abc|ABC","hhabce2w3l3lABCo#12")
????[‘abc‘,‘ABC‘]
????>>>
????
?10.?"(...)"?分组匹配。
????>>> re.search("(abc){2}","hhabcabc2w3l3lABCo#12abc")????#匹配字符串abc的匹配次数
????<_sre.SRE_Match object; span=(2,8),match=‘abcabc‘>
????
????>>> re.search("abc{2}","hhabcabcccccabc2w3l3lABCo#12abc")???#只是匹配c匹配次数
????<_sre.SRE_Match object; span=(5,match=‘abcc‘>
????
????>>> re.search("(||){2}","hhabcabc2w3l3lABCo#12||||abc||")
????<_sre.SRE_Match object; span=(21,25),match=‘||||‘>
?
?11.?""??转义字符,使后一个字符改变原来的意思
?
??"A"??只匹配字符串开头,?同^
??"Z"??只匹配字符串结尾,? 同$
??????>>> re.search("Ahh.+||Z","hhabcabc2w3l3lABCo#12||abc||")
??????<_sre.SRE_Match object; span=(0,28),match=‘hhabcabc2w3l3lABCo#12||abc||‘>
??"d"??匹配数字: ??????[0-9]
??"D"??匹配非数字:??????[^0-9]????
??"w"??匹配包括下划线在内的任何字符:?[A-Za-z0-9_]
??"W"??匹配非字母字符,即匹配特殊字符?[^A-Za-z0-9_]
??"s"??匹配任何空白字符:????<空格>t,n,r,f,v
??"S"??匹配非空白字符:????[^s]
?
?
?
?
?12.?正则表达式中中括号中可以表示
??1.?某个区间内 如 [a-zA-Z0-9]
??2.?某几个的范围 [abcd]
??3.?可以在中括号中进行取非的操作. [^a]
??4.?在中括号中的字符不再有特殊的含义? 如经常匹配全部的 .和*? [.][*]
?
?
?
??>>> re.search("(?P<id>[0-9])","abcd1212sdsd121#we")
??<_sre.SRE_Match object; span=(4,match=‘1‘>
??>>>
??>>> re.search("(?P<id>[0-9])","abcd1212sdsd121#we").group()
??‘1‘
??>>> re.search("(?P<id>[0-9]+)","abcd1212sdsd121#we").group()
??‘1212‘
??>>> re.search("(?P<id>[0-9]+)","abcd1212sdsd121#we").groupdict()
??{‘id‘: ‘1212‘}
??>>>
??>>> re.search("(?P<id>[0-9]+(?P<name>[a-zA-Z]+))","abcd1212sdsd121#we").groupdict()
??{‘id‘: ‘1212sdsd‘,‘name‘: ‘sdsd‘}
??>>>
??>>> re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birth>[0-9]{8})","362822198509160042").groupdict()
??{‘province‘: ‘3628‘,‘city‘: ‘22‘,‘birth‘: ‘19850916‘}
??>>>
??
??
?匹配: (需要用r且加转义)
??>>> re.search(r"","abcss12sd08999aas") ??<_sre.SRE_Match object; span=(3,4),match=‘‘> ??>>> ??>>> ??>>> re.search(r"","abcss12sd08999aas") ??<_sre.SRE_Match object; span=(3,"abcss12sd08999aas") ??<_sre.SRE_Match object; span=(3,match=‘‘> ??>>> ?? ? ?匹配忽略大小写:(flags = re.I)? ??>>> re.search("[a-z]+","abcss12sd08999aas",flags=re.I) ??<_sre.SRE_Match object; span=(0,3),match=‘abc‘> ??>>> re.search("[a-z]+",flags=re.I).group() ??‘abc‘ ??>>> ??>>> re.search("[a-z]+","aBcCss12sd08999aas",match=‘aBc‘> ??>>> ?? ? ?匹配多行模式:(re.M),改变"^"和"$"的行为; ??>>> re.search(r"^a","nabcneeee") ??>>> ??>>> ??>>> re.search(r"^a","nabcneeee",flags=re.M) ??<_sre.SRE_Match object; span=(1,match=‘a‘> ??>>> ??>>>? ?? ?点任意匹配模式,改变"."的行为,re.S ? ? 解释一下: 1.正则匹配串前加了r就是为了使得里面的特殊符号不用写反斜杠了。 2.[ ]具有去特殊符号的作用,也就是说[(]里的(只是平凡的括号

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读