正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在不少文本编辑器里,正则表达式一般被用来检索、替换那些匹配某个模式的文本。python
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。正则表达式
一、简单看一下写法ssh
函数语法:编辑器
re.match(pattern, string, flags=0)函数
函数参数说明: 参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串。 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.match方法返回一个匹配的对象,不然返回None。 咱们可使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法 描述 group(num=0) 匹配的整个表达式的字符串,group() 能够一次输入多个组号,在这种状况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含全部小组字符串的元组,从 1 到 所含的小组号。
import re p = re.compile('abcd') print(type(p)) #<class '_sre.SRE_Pattern'> print(dir(p)) #['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'findall', 'finditer', 'flags', 'fullmatch', 'groupindex', 'groups', 'match', 'pattern', 'scanner', 'search', 'split', 'sub', 'subn'] m = p.match('abcdef') print(type(m)) #<class '_sre.SRE_Match'> print(dir(m)) #['__class__', '__copy__', '__deepcopy__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'end', 'endpos', 'expand', 'group', 'groupdict', 'groups', 'lastgroup', 'lastindex', 'pos', 're', 'regs', 'span', 'start', 'string'] print(m.group()) #abcd print(m.group(0)) #abcd
re.match()方法值匹配字符串的开头若是不知足,就返回一个Nonespa
import re p = re.compile('abcd') m = p.match('abdcef') print(m.group()) #AttributeError: 'NoneType' object has no attribute 'group'
神奇的.regexp
import re p = re.compile('.') m = p.match('abdcef') print(m.group()) #a
特殊字符(元字符)orm
注意:\在里面是转义词的意思,例如,你想匹配一个re.compile('.'),这个.是匹配任意字符。可是我就想让它匹配一个.怎么办,re.compile('\.'),这样的话它就真的只匹配一个点。对象
import re p = re.compile('\.') #匹配符号点(注意这里可前面加上了转义符\,就不是匹配任意字符了) m = p.findall('abc.def.') print(type(m)) #<class 'list'> print(m) #['.', '.'] #能够得出,返回的是一个list,全局查找,不想match方法只匹配字符串开头
数量词:blog
贪婪模式和非贪婪模式
一、一个小例子
咱们知道*表示匹配一个字符串0次或者屡次,而+是匹配字符串1次或屡次,因此*的时候匹配了0次也打印出来了,而+只找匹配1次的字符。
import re p = re.compile('[abc]+') m = p.findall('abcdef') print(m) #* #['abc', '', '', '', ''] #+ #['abc']
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽量多的匹配.
而非贪婪模式在整个表达式匹配成功的前提下,尽量少的匹配。
二、{}
根据下面的例子不难看出,数量词{m}表示的是匹配前面字符串的几个字符串
import re p = re.compile('[abc]{3}') m = p.findall('abcdabcd') print(m) #{1} #['a', 'b', 'c', 'a', 'b', 'c'] #{2} #['ab', 'ab'] #{3} #['abc', 'abc']
re.search 扫描整个字符串并返回第一个成功的匹配,不然返回的是None(注意findall返回的是list,而search返回的直接就是字符串)
import re p = re.compile('abcd') m = p.search('abcdabcd') print(m.group())
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
示例一:
替换一#开头的全部字符(匹配任意字符0次或者屡次),替换成无。
import re phone = "2004-959-559 # 这是一个国外电话号码" num = re.sub('#.*','',phone) print(num)
示例一:扩展
找到全部非数字的字符,‘’表明着删除。
import re phone = "2004-959-559 # 这是一个国外电话号码" num = re.sub('\D','',phone) print(num)
正则表达式能够包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志能够经过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志: