Python 正则表达式详解

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 Python技术文章2018-10-19 |程序圆 |python,正则表达式

Python 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!!”以上实例执行结果如下:matchObj.group() :  Cats are smarter than dogsmatchObj.group(1) :  CatsmatchObj.group(2) :  smarter(2)re.search方法re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:re.search(pattern, string, flags=0)函数参数说明:参数  描述pattern        匹配的正则表达式string        要匹配的字符串。flags        标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。匹配成功re.search方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。匹配对象方法描述        group(num=0)        匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups()        返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。实例#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:15# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import reprint(re.search(‘www’, ‘www.runoob.com’).span())  # 在起始位置匹配print(re.search(‘com’, ‘www.runoob.com’).span())         # 不在起始位置匹配以上实例运行输出结果为:(0, 3)(11, 14)实例#!/usr/bin/pythonimport reline = “Cats are smarter than dogs”;searchObj = re.search( r'(.*) are (.*?) .*’, line, 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)else:   print “Nothing found!!”以上实例执行结果如下:searchObj.group() :  Cats are smarter than dogssearchObj.group(1) :  CatssearchObj.group(2) :  smarterre.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。实例#!/usr/bin/pythonimport reline = “Cats are smarter than dogs”;matchObj = re.match( r’dogs’, line, re.M|re.I)if matchObj:   print “match –> matchObj.group() : “, matchObj.group()else:   print “No match!!”matchObj = re.search( r’dogs’, line, re.M|re.I)if matchObj:   print “search –> matchObj.group() : “, matchObj.group()else:   print “No match!!”以上实例运行结果如下:No match!!search –> matchObj.group() :  dogsMatch从开头开始匹配,匹配不到,返回空Search从开头开始匹配,然后第第二个开始匹配,只匹配一个结果。Match的效率是最高的,就要求我们正则表达式要写正确(3)Split方法re.splitsplit 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:re.split(pattern, string[, maxsplit=0, flags=0])参数  描述pattern        匹配的正则表达式string        要匹配的字符串。maxsplit        分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。flags        标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 – 可选标志实例>>>import re >>> re.split(‘\W+’, ‘runoob, runoob, runoob.’) [‘runoob’, ‘runoob’, ‘runoob’, ”] >>> re.split(‘(\W+)’, ‘ runoob, runoob, runoob.’) [”, ‘ ‘, ‘runoob’, ‘, ‘, ‘runoob’, ‘, ‘, ‘runoob’, ‘.’, ”] >>> re.split(‘\W+’, ‘ runoob, runoob, runoob.’, 1) [”, ‘runoob, runoob, runoob.’] >>> re.split(‘a*’, ‘hello world’) # 对于一个找不到匹配的字符串而言,split 不会对其作出分割 [‘hello world’]split(string[, maxsplit])按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:15# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import rep = re.compile(r’\d+’)print(p.split(‘one1two2three3four4’))结果:[‘one’, ‘two’, ‘three’, ‘four’, ”](4)sub检索和替换Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。语法:re.sub(pattern, repl, string, count=0, flags=0)参数:•        pattern : 正则中的模式字符串。•        repl : 替换的字符串,也可为一个函数。•        string : 要被查找替换的原始字符串。•        count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。实例#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:33# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import rephone = “2004-959-559 # 这是一个国外电话号码”# 删除字符串中的 Python注释 num = re.sub(r’#.*$’, “”, phone)print “电话号码是: “, num # 删除非数字(-)的字符串 num = re.sub(r’\D’, “”, phone)print “电话号码是 : “, num以上实例执行结果如下:电话号码是:  2004-959-559 电话号码是 :  2004959559repl 参数是一个函数以下实例中将字符串中的匹配的数字乘以 2:实例#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:15# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import repattern = re.compile(r’\d+’)   # 查找数字result1 = pattern.findall(‘runoob 123 google 456’)result2 = pattern.findall(‘run88oob123google456’, 0, 10)print(result1)print(result2)执行输出结果为:A46G8HFD1134(5)findall方法在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。语法格式为:findall(string[, pos[, endpos]])参数:•        string : 待匹配的字符串。•        pos : 可选参数,指定字符串的起始位置,默认为 0。•        endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。查找字符串中的所有数字:实例#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:15# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import repattern = re.compile(r’\d+’)   # 查找数字result1 = pattern.findall(‘runoob 123 google 456’)result2 = pattern.findall(‘run88oob123google456’, 0, 10)print(result1)print(result2)输出结果:[‘123’, ‘456’][’88’, ’12’](6)finditer方法和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。re.finditer(pattern, string, flags=0)参数:参数 描述        pattern        匹配的正则表达式string        要匹配的字符串。flags        标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 – 可选标志实例#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 22:15# @Author  : Feng Xiaoqing# @File    : test2.py# @Function: ———–import reit = re.finditer(r”\d+”,”12a32bc43jf3″) for match in it:     print (match.group() )输出结果:12 32 43 3group()group(0)       group(1)     group(“tagname”)gourps()groupdict()findallimport rep = re.compile(r’\d+’)print(findall(‘one1two2three3four4’))结果:[‘1’, ‘2’, ‘3’, ‘4’]finditersubSplit  \d+‘one1two2three3four4’#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2018/4/29 20:24# @Author  : fengxiaoqing# @File    : test.py”'<h1>xxx</h1>   查看不同匹配规则的效率”’import reimport timeit# print(timeit.timeit(setup=”’import re; reg = re.compile(‘<(?P<tagname>\w*)>.*</(?P=tagname)>’)”’, stmt=”’reg.match(‘<h1>xxx</h1>’)”’, number=1000000))# print(timeit.timeit(setup=”’import re”’, stmt=”’re.match(‘<(?P<tagname>\w*)>.*</(?P=tagname)>’, ‘<h1>xxx</h1>’)”’, number=1000000))s = “ab<h1>xxx</h1>dsafasdf<html>sdfads</html>”reg = re.compile(r”(<(?P<tag>\w+)>(.*)</(?P=tag)>)”)print(reg.match(s))print(reg.search(s).group(3))print(reg.findall(s))# print(reg.findall(s)[1])# print(reg.findall(s)[2])# reg.split(s)# reg.findall(s)# reg.groups(s)x = ‘1one2two3three4four’reg1 = re.compile(“\d”)print(reg1.findall(x))print(reg1.split(x))程序圆:程序圆人工智能+Python培训学院
首发:http://python.itcast.cn/

Python教程

Python线程与进程手记

2021-5-27 8:38:03

Python教程

Innodb和MySIAM在存储方式上有什么区别?

2021-5-27 14:38:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索