19 python正则表达式及相关函数

  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 个或多个字符(贪婪匹配)    <*>匹配<title>chinaunix</title>
 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 (?<!...)    Matches if not preceded by ... (must be fixed length).    '(?<!hello)test'  在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        此时只需使用()进行分组就好了

 

posted @ 2018-07-02 15:52  虫儿要吃草  阅读(551)  评论(0编辑  收藏  举报