可以浏览的外文网站,全网搜索,个人网站的设计与实现,网站架构计划书是一个计算机科学概念用于使用单个字符串来描述#xff0c;匹配某个规则的字符串常常用来检索#xff0c;替换某些模式的文本正则的写法.(点号)#xff1a;表示任意一个字符#xff0c;除了[](中括号)#xff0c;匹配括号中列举的范围#xff0c;如[0-9]代表任意单个字数…是一个计算机科学概念用于使用单个字符串来描述匹配某个规则的字符串常常用来检索替换某些模式的文本正则的写法.(点号)表示任意一个字符除了[](中括号)匹配括号中列举的范围如[0-9]代表任意单个字数[a-z]代表任意单个小写字母d: 任意一个数字D除了数字都可以s表空格tab键S除了空格tab键之外w单词字符a-z,A-Z,0-9,_W除了字母和数字*表示前面的内容重复零次或者多次表面前面内容至少出现一次?表面前面的内容出现一次或者零次{m, n} 出现m到n次^ 匹配字符串的开头$匹配字符串的结尾()对正则表达式的内容进行分组从第一个括号开始A匹配字符串开始Z匹配字符串末尾|左右任意一个使用大致步骤使用compile将表示正则的字符串编译为一个pattern对象利用Pattern对象提供的方法对文本进行匹配获取匹配结果最后利用match对象提供的属性和方法后去信息根据需要进行操作常用匹配方法match匹配必须从第一个字符开始就能匹配上否则匹配失败返回的结果只有一个并且支持group分组import retext 1234aash34235235fdosdfp re.compile([0-9]*)result p.match(text)print(result)print(result.group())print(result.span())输出结果1234(0, 4)返回结构体re.Matchspan表示匹配的跨度从哪里匹配到哪里结束左包括右边不包括group表示匹配的组如果只有一组则直接打印内容start显示开始匹配的字符串的位置end表示结束字符串的位置groups当正则里面出现括号时搭配使用import retext 1234aash34235235fdosdfp re.compile(([0-9]*)) # 这里多了一个括号result p.match(text)print(result)print(result.group())print(result.groups())print(result.span())1234(1234,)(0, 4)search匹配与match基本一致也只返回一个结果但是可以不用从开头位置匹配返回一个结果支持group分组import retext a1234aash34235235fdosdfp re.compile([0-9])result p.search(text)print(result)print(result.group())1234findall匹配匹配所有能匹配到的结果不支持group分组默认返回一个列表import retext a1234aash34235235fdosdfp re.compile([0-9])result p.findall(text)print(result)[1234, 34235235]finditer匹配匹配所有能匹配到的结果默认返回一个迭代由re.Match迭代而成可以通过for循环取出re.Match支持group分组import retext a1234aash34235235fdosdfp re.compile([0-9])result p.finditer(text)print(result)for r in result: print(r) print(r.group())123434235235sub替换可以用sub替换要匹配的字符sub为批量替换即可以替换多个位置import retext a1234aash34235235fdosdfp re.compile([0-9])result p.sub(0, text) # 把结果全部替换为0print(result)a0aash0fdosdfgroup与groups的区别group与groups都属于re.Match的内置属性group用于直接显示匹配结果而groups用于提取匹配结果中的值以提取百度网页title为例import reimport requestsurl https://www.baidu.comheaders { User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36}response requests.get(url, headersheaders)html response.textp re.compile((.*?)) # 提取title中间的值result p.search(html)print(result.group())print(result.groups())百度一下你就知道(百度一下你就知道,)可以看出group直接把整个匹配的结果都提取出来了groups只提取了匹配值中括号的部分并且需要搭配()括号使用并且group的结果是一个字符串而groups的结果是一个tuple如果存在多个组的时候两个结果更不相同import retext 2020-04-05p re.compile(([0-9]{4})-([0-9]{2})) # 这里分了两个组一组提取年份一组提取月份result p.search(text)print(result)print(result.group()) # 打印匹配值print(result.groups()) # 打印匹配结果返回一个tupleprint(result.group(0)) # 打印所有组和group()一样print(result.group(1)) # 打印第一组的匹配值print(result.group(2)) # 打印第二组的匹配值print(result.groups(0)) # 打印所有匹配结果和groups一样的可以看出group和groups里面是否加零结果都是一样的即返回所有组group可以指定返回第几组的值相对来说更好筛选groups直接返回匹配的所有值根据这里特性我们可以重新使用group对上面的百度标题进行爬取import reimport requestsurl https://www.baidu.comheaders { User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36}response requests.get(url, headersheaders)html response.textp re.compile((.*?)) # 提取title中间的值result p.search(html)print(result.group())print(result.group(1)) # 把第1组的结果打印出来print(result.groups())百度一下你就知道百度一下你就知道(百度一下你就知道,)正则表达式修饰符re.I演示假设想要匹配所有字母不区分大小写import retext1 shdfi1234SHDFISHDIp re.compile([a-z], re.I) # 不区分大小写所有字母都匹配result p.findall(text1)print(result)[shdfi, SHDFISHDI]re.M演示假设匹配以sh开头以2结尾的字符串import retext1 sh22dfi1234SHDFIssSHDIp re.compile(^sh.*2$, re.M) # 匹配多行,即忽略回车匹配所有小写字母p2 re.compile(^sh.*2$)result p.findall(text1)result2 p2.findall(text1)print(result)print(result2)[sh22dfi12][]可以看出在多行模式下一个字符串根据回车符号被拆分成两行即有两个开头与结尾。re.S演示假设匹配一个d..I的字符串import retext1 sh22dfi1234SHDFIssSHDIp1 re.compile(d.*I)p2 re.compile(d.*I, re.S) # 让点号也能匹配换行符result1 p1.search(text1)result2 p2.search(text1)print(result1) # 目前没有匹配上print(result2.group()) # 从下面的结果来看换行符也被匹配上了Nonedfi1234SHDFIssSHDI匹配中文匹配中文[一-龥]不包括全角标点贪婪匹配与非贪婪匹配. *和.*?import retext 12ddd345# 匹配一个数字开头数字结尾的字符串p1 re.compile([0-9].*[0-9]) # 贪婪模式p2 re.compile([0-9].*?[0-9]) # 非贪婪模式result1 p1.search(text)result2 p2.search(text)print(result1.group())print(result2.group())12ddd34512正则表达式默认使用贪婪匹配import retext u123你好bbabdp1 re.compile(u[一-龥]{1,2}) # 匹配一个或者两个中文result1 p1.search(text)print(result1.group()) # 打印结果是匹配两个你好如果使用非贪婪匹配import retext u123你好bbabdp1 re.compile(u[一-龥].*?) # 匹配一个或者两个中文result1 p1.search(text)print(result1.group()) # 打印结果是匹配一个你