正则表达式是任何语言中不可或缺的功能,下面我根据python办公自动化一书中的内容进行总结,在sublime Tex完成汇总,直接介绍如下,欢迎大家参考,提出宝贵意见和补充。
1 #正则表达式总结 2 3 #使用正则表示方法总结,下面利用一个查找电话号码的方式创建一下 4 #导入正则模块 5 import re 6 #(1)创建一个Regex对象,出入需要查找的字符串,使用r表示按元字符查找,\d表示一个数字 7 phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') 8 #(2)调用Regex对象查找方法,搜寻传入的字符串,返回一个Match对象mo 9 mo = phoneNumRegex.search('My number is 415-555-4242.') 10 #(3)调用Match对象的方法group,返回匹配对象 11 print(mo.group()) 12 #--->415-555-4242 13 14 #利用正则表示式匹配更多模式 15 #(1)利用括号分组,每一组括号代表一组,group()方法传入0或不传入,返回整个匹配文本,传入整数分别匹配不同部分 16 import re 17 phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') #利用括号对内容分了两组 18 mo = phoneNumRegex.search('My number is 415-555-4242') 19 mo.group(1) #--->415 20 mo.group(2) #--->555-4242 21 mo.group() #--->415-555-4242 22 #可以利用groups返回多个值 23 areaCode, mainNumber = mo.groups() 24 #括号()在正则表达式中有特殊含义,若是要匹配括号,则用\(\)进行匹配 25 #---》(\(\d\d\d\)) ---(359) 26 27 #(2)利用管道配备多个分组 28 #字符'|'为管道,希望匹配多个表达式中的一个时,可以利用'|'匹配其中一个 29 import re 30 heroRegex = re.compile(r'mayun|mahuateng') 31 mo = heroRegex.search("mayun and mahuateng.") 32 mo.group 33 #--->mayun 先找到哪一个就匹配哪一个 34 #若是匹配的字符串都是以ma开始也可以这样写 35 heroRegex = re.compile(r'ma(yun|huateng)') 36 mo = heroRegex.search("mayun and mahuateng") 37 mo.group() #--->mayun 38 mo.group(1)#-->yun 39 40 #(3) 利用?匹配0次或一次 41 import re 42 phoneRegex = re.compile(r'(\d\d\d-)?\d\d\d-\d\d\d\d') 43 mo1 = phoneRegex.search('my number is 415-355-3232') 44 mo1.group() 45 #--->415-355-3232 46 mo2 = phoneRegex.search('555-3235') 47 mo2.group() 48 #---->555-3235 49 50 #(4)利用*匹配0次或多次,使用方法同? 51 import re 52 moneyRegex = re.compile(r'(\d)*\$') 53 mo = moneyRegex.search('My money is 359035$') 54 mo.group() 55 #---->359035$ 56 57 58 #(5)利用+匹配一次或多次,使用方法同上,不在举例 59 60 #(6)利用花括号{}匹配特定次数 61 #(mei){3}匹配字符---》meimeimei 62 #还可以用{}指定范围{3,5},将匹配3到5次,(\1){3,5}--->111|1111|11111 63 64 #(7)贪心匹配和非贪心匹配 65 #python默认是贪心匹配,(m){3,5} ---》先按照'mmmmm'最多个字符来匹配 66 #若是要利用非贪心匹配,(m){3,5}?---》先匹配'mmm'将按照最少字符进行匹配 67 68 #(8)findall()方法 findall()也是Regex对象的方法,它返回一组字符串 69 #search()返回第一次出现的文本,findall,返回出现的所有文本 70 #正则表达式中没有分组,将返回字符串列表,若是有分组,将返回元组列表 71 phoneRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') 72 phoneNumRegex.findall('cell:425-325-7763 Word:213-252-2354') 73 #---->['425-325-7763','213-252-2354'] 74 phoneRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') 75 phoneRegex.findall('cell:425-325-7763 Word:213-252-2354') 76 #---->[('425','325','7763'),('213','252',2354)] 77 78 #(9)字符分类 79 """ 80 \d 表示 0-9的任何数字 81 \D 表示 除0到9以外的任何字符 82 \w 表示 任何字母、下划线、数字字符(可以认为是匹配单词的字符) 83 \W 表示 除字母、下划线、数字字符以外的任何字符 84 \s 表示 空格、制表符、或换行符(可以认为是匹配空白的字符) 85 \S 表示 除空格、制表符和换行符以外的任何字符 86 """ 87 xmasRegex = re.compile(r'\d+\s\w+') #匹配多个数字 一个空白 多个字符 88 xmasRegex.findall('1 qilvzhuiche,2 xiangshizaitianya,3 zailushang,4 yingzaidasi') 89 #--->['1 qilvzhuiche','2 xiangshizaitianya','3 zailushang','4 yignzaidasi'] 90 91 #(10) 建立自己的字符分类 92 #使用[]匹配[]内的任何字符[aeiouAEIOU]匹配其中的任何字符,不论大小写 93 #[1-9a-zA-Z]匹配所有的数字、小写字符、大写字母 94 #注意普通的正则表达式符号不会被解释如:.*?+(),在[]中不用再加\ 95 #通过'^'可以匹配非[]内的任何字符,[^0-9]匹配非数字字符 96 97 #(11) 插入字符和美元字符 98 #通过使用^表示以字符开始,使用$表示以指定字符结尾 99 wholeStringNum = re.compile(r'^\d+$') #匹配从开始到结尾都是数字的字符串 100 wholeStringNum.search('1444sl;jafs125') 101 #---->'1444sl;jafs125' 102 103 #(12) 通配字符句号.,英文句点。它匹配除换行以外所有的字符,一个句点只能匹配一个字符 104 #要匹配真正的句点要用\. 105 106 #使用.*匹配所有字符,注.*默认匹配所有的,贪心模式,若是匹配最少可用.*? 107 nameRegex = re.compile(r'First Name:(.*) Last Name:(.*)') 108 mo = nameRegex.search('First Name:AI Last Name:Sweigart') 109 mo.group(1) #--->'AI' 110 mo.group(2) #--->'swigart' 111 112 #使用句点.字符匹配换行,通过传入re.DOTALL作为re.compile()的第二个参数,可以匹配所有字符,含换行符 113 newLineRegex = re.compile('.*',re.DOTALL) 114 newLineRegex.search('server the public trust\nprotect the inncent.').group() 115 116 #不区分大小写的匹配,可以向re.compile()传入re.IGNORECASE或re.I,作为第二个参数 117 robocop = re.compile(r'robocop',re.I) 118 robocop.search('roboCop is part mainNumber').group() #--->roboCoP 119 120 #(13)用sub()方法替换字符串 121 nameRegex = re.compile(r'Agent \w+') 122 nameRegex.sub('CENSORED','Agent Alice gave the secret documents to Agent bob.') 123 #--->'CENSORED gave the secret documents to Agent bob.' 124 125 #假定想要隐去密探的姓名,只显示他们姓名的第一个字母,要做到这一点,可以使用正则表达式 126 #Agent(\w)\w*,传入r'\1****'作为sub()的第一个参数。字符串中的\1将由分组1匹配的文本代替,也就是正则表达式的(\w)分组 127 agentNameRegx = re.compile(r'Agent (\w)\w*') 128 agentNameRegx.sub(r'\1****','Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.') 129 #--->A**** told C**** that E**** knew B**** was a double agent. 130 131 #(14) 管理复杂的正则表达式 132 #要匹配复杂的文本模式,可能需要长的、费解的正则表达式,可以告诉complie(),忽略正则表达式字符串中的空白符和注释,可以传入变量re.VERBOSE 133 phoneRegex = re.compile(r'''( 134 (\d{3}|\(\d{3}\))? #area code 135 (\s|-|\.)? #separtor 136 \d{3} 137 )''',re.VERBOSE) #first digis) 138 139 140 141 #总结如下: 142 #首先导入正则模块 import re 143 #创建Regex对象 re.complie(r'正则表达式','可选参数') 144 #调用Regex对象的方法,search('查找字符串'):匹配首先找到的文本并返回对象Match 145 # findall('查找字符串'):匹配找到的所有文本,返回字符串列表或元组列表 146 # sub('替换字符串','准备替换的字符串'):根据正则表达式,替换字符串中的内容 147 #调用Match的方法输出内容group()、groups() 148 #?0或1个 *0或多个 + 1或多个 .匹配任何字符一个(除换行)^以字符串开始 $以字符串结尾 149 #()对字符串进行分组 []匹配其中的任何一个 {}进行范围限定,用逗号控制数量 |进行分组,匹配任何一个 150 #\d数字\D非数字 \w 字符(数字字母下滑线)\W非字符\s空格制表符换行\S非字符 151 #字符匹配贪心 匹配所有 非贪心,用?完成匹配最少的 152 #re.IGNORECASE 或re.I不区分大小写 153 #re.DOTALL 句点符号匹配换行 154 #re.VERBOSE 管理复杂正则表达式,可以添加换行空白注释等