re模块
RE模块
1 import re 2 #re模块 3 #正则主要功能就是做模糊匹配,主要是对字符串进行操作 4 ''' 5 就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言, 6 (在Python中)它内嵌在Python中,并通过 re 模块实现。 7 正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。 8 ''' 9 10 11 #字符匹配(普通字符,元字符): 12 #1 普通字符:大多数字符和字母都会和自身匹配 13 #print(re.findall('an','yuanaleSxalexwupeiqi')) 14 #执行结果:['an'] 15 #2 元字符:. ^ $ * + ? { } [ ] | ( ) \ 16 ''' 17 18 元字符说明: 19 . 通配符:可代表任意字符;除去'\n' 20 ^ 以什么开头 21 $ 以什么结尾 22 * 重复符号(0=<*<∞);注意:0次也是匹配到了,所以可以没有,也算匹配到了 23 + 重复符号(1=<*<∞);注意:必须有1次匹配到了,才算匹配成功,必须有一个 24 ? 重复符号(0,1);注意:只有 25 {} 重复符号(指定,指定);可指定任意 26 {5} :该符号必须出现5次 27 {0,} :相当于* 28 {1,} :相当于+ 29 {0,1} :相当于? 30 {2,5} :相当于(2=<X<=5)数量,都取出来 31 [] 字符集 或 至少有一个 []中放的是匹配项;注意在字符集中元字符只当普通字符,没有意义! 32 除去:1、- 什么至什么 如:[a-z] 2、 ^ 非 除了啥的 3、 \ 转义符 33 | 或 左|右 左有和右有都可以被匹配到 34 () 分组;分组中的优先级高 35 去掉优先级(?:<name>)固定格式 name为分组名称 36 \ 转义符;把有意义的转换为没有意义的(如:\r\n\t),把没有意义的转换成有意义的(如:下面) 37 \d 匹配任何十进制数;它相当于类 [0-9]。 38 \D 匹配任何非数字字符;它相当于类 [^0-9]。 39 \s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。 40 \S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。 41 \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 42 \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_] 43 \b 匹配一个特殊字符边界,比如空格 ,&,#等 44 \有一个坑,re将字符转义,python也会将字符转义,同时都支持\转义,后面有解释 45 注意:*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配 46 ''' 47 a = 'qwertyuiopaaasdfghjklll zhaozhaokuo zhaooxcvbnmmm' 48 # . 49 print(re.findall('z..o',a)) 50 #执行结果:['zhao', 'zhao', 'zhao'] 51 print(re.findall('zhao.',a)) #句柄在zhaoa后边,下次开始找就在hao。。。。开始找,所以找到俩 52 #执行结果:['zhaoz', 'zhaox'] 53 54 # ^ 55 print(re.findall('^z..o',a)) #只找开头是不是符合z..o整体的信息,符合返回字符,不符返回空 56 #执行结果:[] 57 58 # $ 59 print(re.findall('mm$',a)) #只看结尾是不是符合mm整体的信息,符合返回字符,不符返回空 60 #执行结果:['mm'] 61 62 # * 63 print(re.findall('ao*',a)) #(0=<*<∞) 过程(把o*看做一个整体,o可以是0次,也可是任意次)没匹配到也是匹配到了,返回'',匹配到了返回一到多个 64 #执行结果:['a', 'a', 'a', 'ao', 'ao', 'aoo'] 65 66 # + 67 print(re.findall('ao+',a)) #(1=<*<∞) o:必须有一个,一到多 68 #执行结果:['ao', 'ao', 'aoo'] 69 70 # ? 71 print(re.findall('ao?',a)) #o:0个或1个 72 #执行结果:['a', 'a', 'a', 'ao', 'ao', 'ao'] 73 74 # {} 75 print(re.findall('o{2}',a)) #o:必须有2个 76 #执行结果:['oo'] 77 print(re.findall('o{1,5}',a)) #o:可以把 1到5的o都取出来 78 #执行结果:['o', 'o', 'o', 'o', 'oo'] 79 80 #贪婪匹配 81 print(re.findall('qa*','qaaaaaaabbbbbb')) 82 #执行结果:['qaaaaaaa'] 83 #惰性匹配 84 print(re.findall('qa*?','qaaaaaaabbbbbb')) 85 #执行结果:['q'] 86 #贪婪匹配与惰性匹配转换,只多了个'?' 87 88 #[] 89 print(re.findall('a[x,y]','axayuubxbyxuua,uu')) 90 # 或 拿着a去匹配[x,y]存在的字符,特殊说明[]中没有特殊字符,所以x ,y 是三个字符!在字符中找符合的项 91 #执行结果:['ax', 'ay', 'a,'] 92 print(re.findall('www[baidu a]','wwwbaidu wwwb wwwa wwwi www ')) 93 #执行结果:['wwwb', 'wwwb', 'wwwa', 'wwwi', 'www '] 94 print(re.findall('q[a*z]','qaqbqcq*qz')) #特殊说明[]中没有特殊字符,除去 - ^ \ 95 #执行结果:['qa', 'q*', 'qz'] 96 print(re.findall('q[a-z]','qaqbqcq*qz')) #特殊说明[]中没有特殊字符,除去 - ^ \ 97 #执行结果:['qa', 'qb', 'qc', 'qz'] 98 print(re.findall('q[^a-z]','qaqbqcq*qz')) # ^ 除去a-z的任意字符 99 #执行结果:['q*'] 100 print(re.findall('q[a-z]*','qaqbqcq*qzzzzzz')) #混合用一下 101 #执行结果:['qaqbqcq', 'qzzzzzz'] 102 103 #计算器 小提示: 104 print(re.findall('\([^()]*\)','12+(36*5+2-5*(2-1))')) #取到最内层的括号的信息 105 #执行结果:['(2-1)'] 106 107 # \ 108 print(re.findall('\d','12+(36*5+2-5*(2-1))')) #\d: 匹配任何十进制数;它相当于类 [0-9]。 109 #执行结果:['1', '2', '3', '6', '5', '2', '5', '2', '1'] 110 print(re.findall('\d+','12+(36*5+2-5*(2-1))')) #\d 111 #执行结果:['12', '36', '5', '2', '5', '2', '1'] 112 113 print(re.findall('\D','12+(36*5+2-5*(2-1))')) #\D:匹配任何非数字字符;它相当于类 [^0-9]。 114 #执行结果:['+', '(', '*', '+', '-', '*', '(', '-', ')', ')'] 115 116 print(re.findall('\s','12+( 36 * 5 + 2 - 5 * ( 2 - 1 ))\t\n\r\f\v')) #\s:匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。 117 #执行结果:[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '\t', '\n', '\r', '\x0c', '\x0b'] 118 119 print(re.findall('\S','12+( 36 * 5 + 2 - 5 * ( 2 - 1 ))\t\n\r\f\v')) #\S:匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。 120 #执行结果:['1', '2', '+', '(', '3', '6', '*', '5', '+', '2', '-', '5', '*', '(', '2', '-', '1', ')', ')'] 121 122 print(re.findall('\w','12+( 36 * 5 + 2 - 5 * ( 2 - 1 ))abcde\t\n\r\f\v')) #\w:匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 123 #执行结果:['1', '2', '3', '6', '5', '2', '5', '2', '1', 'a', 'b', 'c', 'd', 'e'] 124 125 print(re.findall('\W','12+( 36 * 5 + 2 - 5 * ( 2 - 1 ))abcde\t\n\r\f\v')) #\W:匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_] 126 #执行结果:['+', '(', ' ', ' ', '*', ' ', ' ', '+', ' ', ' ', '-', ' ', ' ', '*', ' ', '(', ' ', ' ', '-', ' ', ' ', ')', ')', '\t', '\n', '\r', '\x0c', '\x0b'] 127 128 print(re.findall('www.baidu','www*baidu')) # .可代指任何 129 #执行结果:['www.baidu']['www/baidu']['www*baidu'] 130 print(re.findall('www\.baidu','www*baidu')) # 。 经过转义后,.没有特殊意义,只是. 131 #执行结果:[] 132 133 #-----------------------------eg1: 134 ret=re.findall('c\l','abc\le') 135 print(ret)#[] 136 ret=re.findall('c\\l','abc\le') 137 print(ret)#[] 138 ret=re.findall('c\\\\l','abc\le') 139 print(ret)#['c\\l'] 140 ret=re.findall(r'c\\l','abc\le') #r是原生字符,表达式里是什么,传给re就是什么 141 print(ret)#['c\\l'] 142 143 #-----------------------------eg2: 144 #之所以选择\b是因为\b在ASCII表中是有意义的 145 m = re.findall('\bblow', 'blow') 146 print(m) 147 m = re.findall(r'\bblow', 'blow') 148 print(m) 149 150 151 #元字符至分组 152 print(re.findall(r'(ad)+', 'adcadbbbb')) #ab是一个整体 153 #执行结果:['ad', 'ad'] 154 155 ret=re.search('(?P<id>\d{6})/(?P<name>\w{3})','235566/com') 156 print(ret.group())#23/com 157 print(ret.group('id'))#23 158 159 #元字符之| 160 ret=re.findall('(ab)|\d','rabhdg8sd') 161 print(ret)#ab 162 163 164 #1 165 re.findall('a','alvin yuan') #返回所有满足匹配条件的结果,放在列表里 166 #2 167 re.search('a','alvin yuan').group() #函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 168 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 169 170 #3 171 re.match('a','abc').group() #同search,在字符串开始处进行匹配 172 173 #4 174 ret=re.split('[ab]','abcd') #先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 175 print(ret)#['', '', 'cd'] 176 177 #5 178 ret=re.sub('\d','abc','alvin5yuan6',1) #替换 (规则,新值,旧字符串,次数(可为空)) 179 print(ret)#alvinabcyuan6 180 ret=re.subn('\d','abc','alvin5yuan6') #与sub相同,只不过多了统计次数 181 print(ret)#('alvinabcyuanabc', 2) 182 183 #6 184 obj=re.compile('\d{3}') #单定义了规则,可供其它方法调用即可 185 ret=obj.search('abc123eeee') #调用 186 print(ret.group())#123 187 188 #7 189 ret=re.finditer('\d','ds3sy4784a') #查询完成后,得到一个迭代器对象 190 print(ret) #<callable_iterator object at 0x10195f940> 191 print(next(ret).group()) #可通过next取值 192 print(next(ret).group())
常用匹配:
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力 匹配首尾空白字符的正则表达式:^\s*|\s*$ 评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 评注:表单验证时很实用 匹配网址URL的正则表达式:[a-zA-z]+://[^\s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用 匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7} 评注:匹配形式如 0511-4405222 或 021-87888822 匹配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始 匹配中国邮政编码:[1-9]\d{5}(?!\d) 评注:中国邮政编码为6位数字 匹配身份证:\d{15}|\d{18} 评注:中国的身份证为15位或18位 匹配ip地址:\d+\.\d+\.\d+\.\d+ 评注:提取ip地址时有用 匹配特定数字: ^[1-9]\d*$ //匹配正整数 ^-[1-9]\d*$ //匹配负整数 ^-?[1-9]\d*$ //匹配整数 ^[1-9]\d*|0$ //匹配非负整数(正整数 + 0) ^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0) ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数 ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0) ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0) 评注:处理大量数据时有用,具体应用时注意修正 匹配特定字符串: ^[A-Za-z]+$ //匹配由26个英文字母组成的字符串 ^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$ //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串 ^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
匹配IP
import re
def ip_re_test(data):
ip_data = re.match(r"^(?:(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:1[0-9][0-9]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:2[0-5][0-5])|(?:25[0-5])|(?:1[0-9][0-9])|(?:[1-9][0-9])|(?:[0-9]))$", data)
print ip_data
if __name__ == '__main__':
while True:
str_data = str(input('>>>'))
ip_re_test(str_data)

浙公网安备 33010602011771号