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)

 

posted @ 2016-12-15 09:31  总要做些什么  阅读(265)  评论(0)    收藏  举报