正则表达式
正则表达式在线工具
点—匹配所有字符
.表示要匹配除了换行符以外的任何单个字符
import re content = """苹果是绿色的 橙子是橙色的 香蕉是黄色的 乌鸦是黑色的""" p = re.compile(r".色") if __name__=='__main__': for line in p.findall(content): print(line)
星号-重复匹配任意次
*星号表示匹配前面的子表达式任意次,包括0次
import re content = """苹果,是绿色的 橙子,是橙色的 香蕉,是黄色的 乌鸦,是黑色的 猴子, """ if __name__=="__main__": p = re.compile(r",.*") for line in p.findall(content): print(line)
加号-重复匹配多次
+表示匹配前面的子表达式一次或多次,不包括0次
import re content = """苹果,是绿色的 橙子,是橙色的 香蕉,是黄色的 乌鸦,是黑色的 猴子, """ if __name__=="__main__": p = re.compile(r",.+") for line in p.findall(content): print(line)
花括号-匹配指定次数
表达式油{3,4}表示匹配 连续的 油 字 至少3次,至多4次
import re content = """红彤彤,绿油油,黑乎乎,绿油油油油""" p = re.compile(r"油{2,3}") #也可以"油{4}"这样使用 if __name__=='__main__': for line in p.findall(content): print(line)
问号-表示非贪婪模式
*+,等默认为贪婪模式,加上问号后表示为非贪婪模式
import re content = "<html><head><title>Title></title>" p1 = re.compile(r"<.*>") p2 = re.compile(r"<.*?>") if __name__=="__main__": print("---------贪婪模式----------") for line in p1.findall(content): print(line) print("---------非贪婪模式----------") for line in p2.findall(content): print(line)
反斜杠的多种用途
\转义包含元字符的内容 ****
import re content = """ 苹果.是绿色的 橙子.是橙色的 香蕉.是黄色的 乌鸦.是黑色的""" p1 = re.compile(r".*\.") #对.进行转义 if __name__=="__main__": for line in p1.findall(content): print(line)
\d 匹配0-9之间任意一个数字,等价于表达式[0-9]
\D匹配任意不是0-9之间的数字字符,等价于表达式[^0-9]
\s匹配任意一个空白字符,包括空格,tab,换行符等,等价于表达式[\t\n\r\f\v]
\S匹配任意一个非空白字符[^\t\n\r\f\v]
\w匹配任意一个文字字符,包括字母,数字,下划线,等价于表达式[a-zA-Z0-9_]
\W匹配任意一个非文字字符,等价于表达式[^a-zA-Z0-9_]
方括号-匹配某几种类型
方括号表示要匹配某几种类型的字符。
[abc]可以匹配a,b,c里面任意一个字符,等价于[a-c]
[a-c]中间的-表示一个范围a-c。
[]中字符失去原来的含义,不需要转义
import re content = """ 张三 15472955246 21 李四 12978952246 23 王五 13378952246 22 赵六 16978955246 23 小七 15078955246 22 """ p1 = re.compile(r"1[3-5]\d{9}") if __name__=="__main__": for line in p1.findall(content): print(line)
起始,结尾位置和单行多行模式
起始行和单行,多行模式
^表示匹配文本起始行位置
正则表达式可以设定单行模式和多行模式
单行模式匹配整个文本的开头位置
多行模式匹配文本每行的开头位置
import re content = """001-苹果价格-60 002-橙子价格-70 003-香蕉价格-40 """ p1 = re.compile(r"^\d+")#默认为单行模式 p2 = re.compile(r"^\d+",re.M)#多行模式 if __name__=="__main__": print("--------单行模式--------") for line in p1.findall(content): print(line) print("--------多行模式--------") for line in p2.findall(content): print(line)
$表示文本的结束位置
单行模式匹配整个文本的结尾位置
多行模式匹配文本每行的结尾位置
import re content = """001-苹果价格-60 002-橙子价格-70 003-香蕉价格-40 """ p1 = re.compile(r"\d+$")#默认为单行模式 p2 = re.compile(r"\d+$",re.M)#多行模式 if __name__=="__main__": print("--------单行模式--------") for line in p1.findall(content): print(line) print("--------多行模式--------") for line in p2.findall(content): print(line)
括号-组选择
括号称之为正则表达式的组选择,是从正则表达式匹配内容里面扣取出其中的某部分
import re content = """张三 15472955246 21 李四 12978952246 23 王五 13378952246 22 赵六 16978955246 23 小七 15078955246 22""" p = re.compile(r'^(.+).*(\d{11}).*',re.M)#多个括号取值结果为元组格式 if __name__=="__main__": for line in p.findall(content): print(line)
使用正则表达式切割字符串
字符串对象的split()方法只适应于非常简单的字符串切割。而正则下的split更加灵活。
import re names = "关羽; 张飞, 赵云,马超, 黄忠 李逵" p = re.split(r'[;,\s]+',names) print(p)
sub替换-参数为回调函数
import re content = """ 下面是这学期要学习的课程: <a href='https://www.bilibili.com/video/av66771949/?p=1' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a> 这节讲的是牛顿第2运动定律 <a href='https://www.bilibili.com/video/av46349552/?p=125' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a> 这节讲的是毕达哥拉斯公式 <a href='https://www.bilibili.com/video/av90571967/?p=33' target='_blank'>点击这里,边看视频讲解,边学习以下内容</a> 这节讲的是切割磁力线 """ #替换函数,参数是match对象 def sunFunc(match): #Match对象的group(0)返回的是整个匹配上的字符串 src = match.group(0) #Match对象的group(1)匹配的是第一个分组的内容 number = int(match.group(1))+6 dest = f'/av{number}' print(f'{src} 替换为 {dest}') #返回最终的值 return dest if __name__=="__main__": new = re.sub(r'/av(\d+?)/',sunFunc,content) print(new)