1 1,正则表达式
2 ########################################
3 1,元字符
4 . ^ $ * + ? {} [] \ | ()
5
6 "." 任意字符
7 "^" 字符串开始 '^hello'匹配'helloworld'而不匹配'aaaahellobbb'
8 "$" 字符串结尾 与上同理
9 "\\" 特殊字符转义或者特殊序列
10 [] 表示一个字符集,匹配字符集中的一个字符
11 [0-9]、[a-z]、[A-Z]、[^0]
12 []中如果出现元字符,则元字符匹配意义失效,只作为普通字符
13
14 "*" 0 个或多个字符(贪婪匹配) <*>匹配
15 "+" 1 个或多个字符(贪婪匹配) 与上同理
16 "?" 0 个或1个字符(贪婪匹配) 即可有可无
17 {m} 对前一个字符重复m次,a{6}匹配6个a、a{2,4}匹配2到4个a
18 {m,n} 对于前一个字符重复m到n次,
19 {m,n}? 对于前一个字符重复m到n次,并取尽可能少
20 re.findall("a{2,4}?","aaaaaa")中 只会匹配2个
21
22
23
24 "|" 或 A|B,或运算
25 (...) 匹配括号中任意表达式
26 (?#...) 注释,可忽略
27 (?=...) Matches if ... matches next, but doesn't consume the string. '(?=test)' 在hellotest中匹配hello
28 (?!...) Matches if ... doesn't match next. '(?!=test)' 若hello后面不为test,匹配hello
29 (?<=...) Matches if preceded by ... (must be fixed length). '(?<=hello)test' 在hellotest中匹配test
30 (?if not preceded by ... (must be fixed length). '(?' 在hellotest中不匹配test
31
32 #############################################
33 正则表达式特殊序列表如下:
34 \A 只在字符串开始进行匹配
35 \Z 只在字符串结尾进行匹配
36 \b 匹配位于开始或结尾的空字符串
37 \B 匹配不位于开始或结尾的空字符串
38 \d 相当于[0-9]
39 \D 相当于[^0-9]
40 \s 匹配任意空白字符:[\t\n\r\r\v]
41 \S 匹配任意非空白字符:[^\t\n\r\r\v]
42 \w 匹配任意数字和字母:[a-zA-Z0-9]
43 \W 匹配任意非数字和字母:[^a-zA-Z0-9]
44
45 ########################################################
46 ########## 正则表达式的一些函数 ###############
47 ########################################################
48 python中re模块的用法
49
50 Python 的 re 模块(Regular Expression 正则表达式)
51
52 下面我主要总结了re的常用方法。
53 1.re的简介
54 使用python的re模块,python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。
55
56 help(‘modules’) ---查看python中已经安装好的模块
57 import re
58 print re.__doc__ ##可以查询re模块的功能描述信息,即模块前面的注释
59 下面会结合几个例子说明。
60
61 ############################################
62 i=patt.search(line)
63 if i!=None:
64 print line
65 else:
66 print "xxxx"
67
68
69 1.re的主要功能函数
70 常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)
71 ##说明以下中括号,表示可有可无(即是可选参数)
72 compile
73 re.compile(pattern[, flags])
74 作用:
75 把正则表达式语法转化成正则表达式对象
76 flags定义包括:
77 re.I:忽略大小写
78 re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
79 re.M:多行模式(如果要匹配的字符串是多行的话,即忽略换行符)
80 re.S: 即’ . ’并且包括换行符在内的任意字符(注意:’ . ’不包括换行符)
81 即增加了 '.'所能够匹配的范围
82 re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
83
84 search ##从整个字符串中匹配
85 ##返回的也是个match对象或者空
86 re.search(pattern, string[, flags])
87 search (string[, pos[, endpos]])
88 作用:在字符串中查找匹配正则表达式模式的位置,返回 MatchObject 的实例,如果没有找到匹配的位置,则返回 None。
89
90 match ##只匹配开头的
91 ##返回的是一个match对象或者空
92 re.match(pattern, string[, flags])
93 match(string[, pos[, endpos]])
94 作用:
95 match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,
96 而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。
97
98 split
99 ##返回字符串列表
100 re.split(pattern, string[, maxsplit=0, flags=0])
101 split(string[, maxsplit=0])
102 作用:可以将字符串匹配正则表达式的部分割开并返回一个列表
103
104 例:
105 list1=re.split(r"ni","sssniaaanidddniiii")
106 print (list1)
107 结果为:
108 ["sss","aaa","ddd","iiii"]
109 例:
110 list1=re.split(r"(ni)","sssniaaanidddniiii") ###注意正则表达式使用括号和不使用括号的区别
111 print (list1)
112 结果为:
113 ["sss","ni","aaa","ni","ddd","ni","iiii"]
114
115
116 findall
117 ##返回匹配成功的字符列表或者空
118 re.findall(pattern, string[, flags])
119 findall(string[, pos[, endpos]])
120 作用:在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回
121 例:查找[]包括的内容(贪婪和非贪婪查找)
122 例:
123 a=re.findall(r"ni","woainidddni")
124 print (a)
125 结果为:["ni","ni"] ##返回的是将匹配成功的字符串截取出来,返回,组成列表
126
127
128 finditer ()
129 ##返回的是一个迭代器(iterator)的对象或者空
130
131 sub()/subn()
132 sub(正则,要替换成的字符,原始字符串)
133 例:
134 r=re.compile (r"a..b" )
135 a=r.sub("eee","ddaxybccc")
136 print (a)
137 >>ddeeeccc
138 --------
139 print ("#"*20)
140 rr=r"a..b"
141 a=re.sub(rr,"eeeeee","dddaxxbccc")
142 print (a)
143 >>dddeeeeeeccc
144 -----------
145 rr=r"a..b"
146 a=re.sub(rr,"","dddaxxbccc")
147 print (a)
148
149
150 说明:replace也是可以进行替换的,但是的参数并不是正则(因为replace参数不识别元字符)
151
152
153
154 ####### 例子: ########################
155 例:最基本的用法,通过re.RegexObject对象调用
156 #!/usr/bin/env python
157 import re
158 r1 = re.compile(r'world') ##把“word”字符串,转化成正则表达式的对象,这样就可以调用正则表达式的其它函数了
159 if r1.match('helloworld'): ##调用匹配函数
160 print 'match succeeds'
161 else:
162 print 'match fails' ##因为是从位置0开始match所以,未匹配成功,
163
164 if r1.search('helloworld'):
165 print 'search succeeds' ##因为是搜索整个字符串进行匹配,所以会匹配成功
166 else:
167 print 'search fails'
168 说明:
169 以下执行结果为:
170 match fails
171 search fails
172
173 说明一下:
174 r是raw(原始)的意思。因为在表示字符串中有一些转义符,如表示回车'\n'。如果要表示\表需要写为'\\'。但如果我就是需要表示一个'\'+'n',不用r方式要写为:'\\n'。但使用r方式则为r'\n'这样清晰多了。
175
176 例:设置flag
177
178 #r2 = re.compile(r'n$', re.S)
179 #r2 = re.compile('\n$', re.S)
180 r2 = re.compile('World$', re.I) ##设置忽略大小写
181 if r2.search('helloworld\n'): ##所以就可以匹配成功
182 print 'search succeeds'
183 else:
184 print 'search fails'
185
186 例:直接调用
187
188 if re.search(r'abc','helloaaabcdworldn'):
189 print 'search succeeds'
190 else:
191 print 'search fails'
192
193 说明:
194 使用python是的正则表达式,
195 1,可以先 生成正则表达式对象
196 1.1,再使用该对象调用相应函数进行正则匹配
197
198 2,可以直接使用正则表达式类,调用类中的方法,将正则表达式作为第一个参数,被匹配的作为第二个参数,
199
200 #################################################################
201 4,正则分组
202 使用()
203 例:
204 匹配邮箱
205 email=r"\w{3}@\w+(\.com|\.cn)"
206 re.findall(email,"hyy@sina.com")
207 re.findall(email,"hyy@yahoo.cn")
208
209 注意:
210 如果正则中使用到分组,则返回的只有分组所匹配成功的数据(虽说匹配的有很多)
211 即优先返回分组所匹配的数据
212
213 说明:
214 因为有时候,我们虽说匹配很多,但是我们只想要匹配出来字符串的某一段
215 此时只需使用()进行分组就好了