第六篇 正则表达式总结

正则表达式是任何语言中不可或缺的功能,下面我根据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  管理复杂正则表达式,可以添加换行空白注释等

猜你喜欢

转载自www.cnblogs.com/qilvzhuiche/p/8889295.html