
正文
python基础知识---正则
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、python正则简介
python的re模块,让python能够支持perl正则
perl正则的字符集("." "[abc]" "(abc)" "a|b")、锚点("$" "^" "\<\>")、修饰字符("*" "?" "+" "{}") 这里不做介绍
二、re模块中的函数,主要是三种匹配(match、search、findall)、一种替换(sub)、一种分割(split)
3种匹配之间比较:
1,match、search如果匹配到内容则返回一个对象(MatchObject对象),否则返回None,findall返回一个列表(包括空列表)
2,使用group()和groups()方法访问MatchObject对象
3,match只能匹配行首的pattern,search能够匹配非行首的pattern
3种匹配的第3个参数用法:
flags被指定为一个可选的标志。多个标志可以通过按位 OR(|) 来指定。如 re.I | re.M 被设置成 I 和 M 标志:
| 修饰符 | 描述 |
|---|---|
| re.I | 使匹配对大小写不敏感 |
| re.L | 做本地化识别(locale-aware)匹配 |
| re.M | 多行匹配,影响 ^ 和 $ |
| re.S | 使 . 匹配包括换行在内的所有字符 |
| re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
| re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
1,match(apttern,string,flags=0)
flag:标志位,用来控制match的匹配方式,一般都没有指定,默认0
match用来从起始位置开始根据模型去字符串中匹配指定内容,如果没有匹配到内容,会返回None 如果匹配到内容 会返回一个MatchObject的对象
使用group()和groups()方法访问匹配的内容
import restring="1234erqwe123"obj=re.match('\d+',string) #返回一个对象print(obj)print(obj.group()) #使用group()方法访问匹配的内容#<_sre.SRE_Match object; span=(0, 4), match='1234'>#
import restring="@$1234erqwe123"obj1=re.match('([^0-9]+)(\d+)',string)print(obj1.group()) #group()返回一个字符串print(obj1.groups()) #groups()返回一个元组#@$1234#('@$', '1234')
2,search(pattern, string, flags=0)
search和match就一处区别,可以匹配非行首的pattern,也是通过group()和groups()访问匹配到的数据
string="#$1234erqwe123"obj=re.search('(\d+)([^0-9]+)',string)print(obj.group())print(obj.groups())#1234erqwe#('1234', 'erqwe')
3,findall(pattern,string,flags=0)
match和search只能匹配一个pattern ,如果想匹配字符串中所有符合要求的pattern ,使用findall()
findall函数返回一个列表
import restring="#$1234erqwe123"obj=re.findall('\d+',string) #findall函数返回一个列表print(obj)#['1234', '123']
4,sub(pattern,repl,string,n=0)
sub用于替换指定的字符串 ,比字符串方法replace功能丰富
import restring="1234erqwe123adfa123"new_string=re.sub('\d+','**',string) #返回替换后的副本,原字符串不变new_string2=re.sub('\d+','**',string,2) #可指定替换前n个pattern,后面的不替换print(string)print(new_string)print(new_string2)#1234erqwe123adfa123#**erqwe**adfa**#**erqwe**adfa123
sub函数的第二个参数,可以是字符串,也可以是函数,这个链接有详细解释当sub函数的第二个参数是字符串时,可以使用 "\\1" r"\1" "\g<1>" "\g<name>" 反向引用当sub函数的第二个参数是函数时,pattern每匹配到一个实例,就会传一个MatchObject对象给函数,函数的返回值,就是要"替换成"的内容5,split(pattern,string,n)split用于按指定匹配切割字符串,n表示按前n个pattern分割,如果n为空则表示按所有的pattern切割,返回一个列表split函数比字符串方法split功能丰富
import restring="1234erqwe123adfa123"new_string=re.split('\d+',string,1) #以前1个pattern为分割符new_string1=re.split('\d+',string,2) #以前2个pattern为分割符new_string2=re.split('(\d+)',string,1) #如果pattern中带有括号,括号里面的内容会返回new_string3=re.split('(\d+)',string,2) #print(new_string)print(new_string1)print(new_string2)print(new_string3)#['', 'erqwe123adfa123']#['', 'erqwe', 'adfa123']#['', '1234', 'erqwe123adfa123']#['', '1234', 'erqwe', '123', 'adfa123']
三、python应用示例---计算器#主要使用到正则函数、迭代、字符串格式化
import redef chengfa_chufa(string): if not re.findall('\*|/',string): return string expression_list=re.split('([+-]?[0-9.]+[*/][+-]?[0-9.]+)',string,1) number_list=re.split('([*/])',expression_list[1],1) left_number=float(number_list[0]) right_number=float(number_list[2]) if number_list[1]=='*': result=left_number*right_number else: result=left_number/right_number if result>0:# result='+'+str(result) result='%s%s' %('+',result)# string_new=expression_list[0]+str(result)+expression_list[2] string_new='%s%s%s' %(expression_list[0],result,expression_list[2]) if re.findall('\*|/',string_new): return chengfa_chufa(string_new) else:# print(string_new) return string_new#-2+3-4+6.7def jiafa_jianfa(string): string=string.replace('+-','-').replace('-+','-').replace('++','+').replace('--','+') expression_list=re.split('([-+][0-9.]+)',string) result=0 for i in expression_list: if i : num=float(i) result=result+num return resultdef main(string): if not re.findall('\(|\)',string): return jiafa_jianfa(chengfa_chufa(string)) expression_list=re.split('\(([^)(]+)\)',string,1) result=jiafa_jianfa(chengfa_chufa(expression_list[1]))# string_new=expression_list[0]+str(result)+expression_list[2] string_new='%s%s%s' %(expression_list[0],result,expression_list[2]) if re.findall('\(|\)',string_new): return main(string_new) else: return jiafa_jianfa(chengfa_chufa(string_new))if __name__=='__main__': string=input('input expression: ') result=main(string) print(result)






