当前位置: 首页 > 后端技术 > Python

【Python教程】08.正则表达式

时间:2023-03-25 21:40:08 Python

大纲re模块正则表达式练习re模块正则表达式是使用一系列的通配符来匹配字符串。目前最强大的字符串处理工具。Python使用re模块来处理正则表达式。我们用过w=re.sub('[^a-zA-Z]','',w)#去掉非字母sub其实是一种替换方法,第一个参数是匹配方法,也就是whatto学习正则表达式。第二个是内容匹配后要替换的字符串,最后一个是要处理的字符串。除了sub方法外,还有match、search、findall、finditer等主要方法。定义一个正则表达式:reg_exp=r'[^a-zA-Z]'#匹配非字母正则表达式可以以r开头后跟一个字符串,表示这是一个正则表达式。这样就避免了很多转义问题。匹配一个对象:匹配、搜索。ret=re.match(reg_exp,'12')ifretisnotNone:print(ret.group())#匹配到一个输出1,即匹配得到的第一个非字母。如果没有匹配项,则返回None。match必须从头匹配。ret=re.match(reg_exp,'a12')print(ret)#空ret=re.search(reg_exp,'a12')print(ret.group())#正常return1search可以从任意位置开始匹配,return只要有比赛。查找所有匹配项:findall、finditer。ret=re.findall(reg_exp,'a12')print(ret)findall返回列表中的所有匹配内容。输出:foriinre.finditer(reg_exp,'a12'):print(i.group())finditer是一个迭代器方法【需要在for循环中使用的类型】,for循环可以使用遍历出所有匹配值。两者在功能上是等价的。获取匹配位置:除了findall,其他匹配后返回的结果都是一个Match对象。可以通过group()方法获取内容。起始位置和结束位置的元组可以通过span()方法获取。foriinre.finditer(reg_exp,'a12'):print(i.group(),i.span())输出:替换:子。ret=re.sub(reg_exp,'*','a12')print(ret)用*替换非字母。前后正则表达式匹配:^、$。^表示匹配前,$表示匹配后。re.search(r'^abc','abc1')从头开始??匹配,如果匹配到^后面的内容,则返回匹配的Match对象,否则为空。如果re.search(r'c1$','abc1')的结尾与$前面的内容匹配,则返回匹配的Match对象,否则为空。功能上类似于startswith和endswith。但是有了下面的搭配方法,功能就不止这些了。基本字符匹配re.search(r'.\s.','Iamastudent.')#Iare.search(r'\d','Iamastudent.')#Nonere.search(r'stu..nt','Iamastudent.')#student匹配自定义字符组:[]。re.search(r'[abcde]','我是学生。')#are.search(r'[^abcde]','我是学生。')#Ire.search(r'[a-z]','我是学生。')#a1.匹配方括号中的字母组中的任何字符。2、加^号表示not,即匹配不在方括号内的字母组的字符。3.匹配括号内的字符范围。reg_exp=r'[^a-zA-Z]'#匹配非字母所以这匹配非a到z和A到Z字符,即非字母。重复匹配:之前的都是单字符匹配,现在学习匹配N个字符。乘号【*】表示匹配前一个字符0到无限次。加号[+]表示匹配前一个字符1至无限次。大括号{}表示匹配多少次。{n}表示n次,{n,m}表示n到m次,{n,}表示至少n次。print(re.findall(r'\w*','你很好'))print(re.findall(r'\w+','你很好'))print(re.findall(r'\w{1,3}','你很好'))输出:问号:?。单个问号表示0次或1次。*?表示非贪婪的0到无限次。+?表示非贪婪1到无限次。贪心就是得到最大的匹配,非贪心就是得到最小的匹配。print(re.findall(r'@ab?','@abc@abc@'))print(re.findall(r'@.+@','@abc@abc@'))#greedyprint(re.findall(r'@.+?@','@abc@abc@'))#非贪心输出:在贪心的情况下,获取第一个@到最后一个@。在非贪心的情况下,当遇到第二个@时,就认为匹配到了。分组是通过匹配获取信息的方式:括号()。mail='lin029011@163.com'ret=re.match(r'(.+)@(.+)',mail)print(ret.group())#没有变化print(ret.groups())#分组结果加括号后,匹配没有变化,结果所属组不变。但是在获取组时,结果是分组的。将我们的邮箱分为正面和背面两部分。验证和分组url。url='https://github.com/lvancer/course_python.git'ret=re.match(r'(\w+)://(.+?)/(.+)\.(\w+)',url)print(ret.group())print(ret.groups())输出:在实际使用中,我们一般会使用工具来验证正则表达式是否正确。比如http://tool.chinaz.com/regex/。验证无误后,重新编写代码。Exercise1.深入正则表达式https://github.com/ziishaned/...和exercisehttps://regex101.com/2。用python实现1中的正则表达式。github:https://github.com/lvancer/course_python