正则表达示 for Python3
前情提要 从大量的文字内容中找到自己想要的东西,正则似乎是最好的方法.也是写爬虫不可缺少的技能.所以,别墨迹了赶紧好好学吧! 教程来自http://www.runoob.com/python3/python3-reg-expressions.html,感谢菜鸟教程. 一. 在Python3中 正则为 re 模块 二.re.match函数 re.match(pattern,string,flags = 0) pattern –> 匹配正则表达式 string –>要匹配的字符串. flags –> 标志位,用于控制正则的匹配方式,如:是否区分大小写,多行匹配等等. 匹配成功re.match方法返回一个匹配的对象,否则返回None. 可以用group(num)或groups()匹配对象函数来获取匹配表达式. group(num = 0) –> 匹配的整个表达式的字符串,group()可以一次输入多个级号,在这种情况下它将返回一个包含那些组所对应值的元组. groups() –> 返回一个包含所有小组字符串的元组,从1至所含的小组号. 例子: !/usr/bin/python3-- coding:utf-8 --import re print(re.match(‘www’,‘www.runoob.com).span()) # 在起始位置匹配. –>(0,3) print(re.match(‘com’,‘www.runoob.com’) # 不在起始位置匹配. –> None 例子2: import re line = ‘Cats are smarter than dogs’ matchObj = re.match(r‘(.) are (.?) .*’,line,re.M|re.I) if matchObj: print(‘matchObj.group():’,matchObj.group()) print(‘matchObj.group(1):’,matchObj.group(1)) print(‘matchObj.group(2):’,matchObj.group(2)) else: print(‘No match!!’) 三. re.search方法 re.search(pattern,flags=0) –> 参数说明和上面一样 匹配成功会返回一个匹配的对象,否则返回None. group(num=0)和groups() 用法和上面一样. 例子: import re print(re.search(‘www’,‘www.baidu.com’).span()) # 在起起始位置匹配. –> (0,3) print(re.search(‘com’,‘www.baidu.com’.span()) # 不在起始位置匹配. –>(11,14) 例子2: import re line = ‘Cats are smarter than dogs’ searchObj = re.search(r‘(.) are (.?) .*’,re.M|re.I) if searchObj: print(‘searchObj.group() : ‘,searchObj.group()) print(‘searchObj.group(1) : ‘,searchObj.group(1)) print(‘searchObj.group(2) : ‘,searchObj.group(2)) 四.re.match 与 re.search的区别 例子: import re line = ‘Cats are smarter than dogs’ matchObj = re.match(r’dogs’,re.M|re.I) if matchObj: print(‘match–>matchObj.group():’,matchObj.group()) else: print(‘No match’) matchObj = re.search(r’dogs’,re.M|re.I) if matchObj: print(‘search –> matchObj.group():’,matchObj.group()) else: print(‘No match’) 五.检索和替换 参数: pattren–> 略 repl–>替换的字符串,也可以为一个函数. string–>要被查找替换的原始字符串. count–>模式匹配后替换的最大次数,默认0表示替换所有的匹配. 例子: import re phone = ‘2004-959-559 # 这是一个电话号码’ 删除注释num = re.sub(r’#.*$’,“”,phone) print(‘电话号码’,num) 移除非数字的内容num = re.sub(r’D,phone) print(‘电话号码:’,num) 六.repl的参数是一个函数 把匹配的数字*2def double(matched): value = int(matched.group(‘value’)) return str(value * 2) s =‘A23G4HFD567’ print(re.sub(‘(?P
七.正则表达式修饰符 – 可选标志 re.l –> 例匹配对大小写不敏感. re.L –> 做本地化识别(locale-aware)匹配 re.M –> 多行匹配,影响^和$ re.S –> 使.匹配包括换行在内的所有字符. re.U –> 根据Unicode字符集解析字符,这个标志影响 w,W,b,B re.X –> 通过给予你更灵活的格式以便你将正则表达式写得更易于理解. 八.正则表达式模式 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只有被黑底时才匹配自身,否则它们的表示特殊的含义. 反斜杠本身需要使用反斜杠转义 由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们.模式元素(如r’/t’ == ‘//t’)匹配相应的特殊字符. 下面列出了正则表达式模式语法中的特殊元素.如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变. ^ –> 匹配字符串的开头 $ –> 匹配字符串的末尾 .?–> 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符. […]?–> 用来表示一组字符,单独列出:[amk]匹配’a’,’m’,或’k’ [^…]?–> 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符. re*?–> 匹配0个或多个表达式. re+?–> 匹配1个或多个表达式. re??–>匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式. re{n}?–>? re{n,}?–>精确匹配n个前面表达式. re{n,m}?–>匹配n到m次由前面的下面表达式定义的片段,贪婪方式 a|b?–> 匹配a或b (re)?–> G匹配括号内的表达式,也表示一个组 (?imx)?–> 正则表达式包含三种可选标志:i,m,x,只影响括号中的区域. (?-imx)?–>?正则表达式关闭 i,或 x 可选标志。只影响括号中的区域。 (?:re)?–>?类似 (…),但是不表示一个组 (?imx: re) –>?在括号中使用i,或 x 可选标志 (?-imx: re) –>?在括号中不使用i,或 x 可选标志 (?#…) –>?注释 (?= re) –>?前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 (?! re) –>?前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 (?> re) –>?匹配的独立模式,省去回溯。 w?–> 匹配字母数字 W?–> 匹配非字母数字 s –> 匹配任意空白字符,等价于[tnrf] S –> 匹配任意非空字符 d?–> ?匹配任意数字,等份于[0-9] D –> 匹配任意非数字 A?–> 匹配字符串开始 Z?–> 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串. z?–> ?匹配字符串结束 G –> 匹配最后匹配完成的位置. b?–> ?匹配一个单词边界,也就是指单词和空格间的位置.例如,’reb’可以匹配’never’中的’er’,但是不能匹配’verb’中的’er’ B?–> ?匹配非单词边界.和b反过来 n t等?–> ?匹配一个换行符 制表符等 1…9?–> 匹配第n个分组的子表达式. 10?–> ?匹配第n个分组的子表达式,如果它经匹配,否则指的是八进制字符码的表达式 九.正则表达式实例 字符类 [Pp]ython??–> ‘Python’或’python’ rub[ye]?–> ‘ruby’ 或’rube’ [aeiou]?–> 匹配中括号内的任意一个字母 [0-9]??–> 匹配任何数字 类似于[0123456789] [a-z]?–> 匹配任何小写字母 [A-Z]?–> 匹配任何大写字母 [a-zA-z0-9]?–> 可以匹配任何字母及数字 [^aeiou]??–> 除了aeiou字母以外的所有字符 [^0-9]??–> 除了数字外的字符 特殊字符类 .??–> 匹配除n这外的任何单个字符.要匹配包括n在内的任何字符,请使用[.n的模式] d D s S w W 上面都有了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |