正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是 re。

re的匹配语法有以下几种

  • re.match 从头开始匹配
  • re.search 匹配包含
  • re.findall 把所有匹配到的字符放到以列表中的元素返回
  • re.split 以匹配到的字符当做列表分隔符
  • re.sub 匹配字符并替换
  • re.fullmatch 全部匹配

 常用的表达式规则   红色加粗的为重要的常用的

  • '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
>>> re.search('.','qasd')  #字母可以匹配
<re.Match object; span=(0, 1), match='q'>
>>> re.search('.','1asd') #数字可以匹配
<re.Match object; span=(0, 1), match=''>
>>> re.search('.','*asd') #特殊字符可以匹配
<re.Match object; span=(0, 1), match='*'>
>>> re.search('..','*asd') #想匹配几个字符,就加几个点
<re.Match object; span=(0, 2), match='*a'>
  • '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
>>> re.search('^','qasd')
<re.Match object; span=(0, 0), match=''>
>>> re.search('^a','qasd')
>>> re.search('^a','abd')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('^ab','abd')
<re.Match object; span=(0, 2), match='ab'>
>>> re.search('^b','abd') #没匹配到,无返回,相当于 re.match('b','abd')
  • '$' 匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
#匹配以什么结尾
>>> re.search('b$','abd')
>>> re.search('b$','ab')
<re.Match object; span=(1, 2), match='b'>
>>> re.search('b$','bab')
<re.Match object; span=(2, 3), match='b'>
#匹配格式
>>> re.match('b$','ab')
>>> re.match('b$','b')
<re.Match object; span=(0, 1), match='b'>
>>> re.match('b$','bob')
>>> re.match('b.b$','bob')
<re.Match object; span=(0, 3), match='bob'>
  • '*' 匹配字符开头,匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'
>>> re.search('a*','Alex') #匹配不到时,返回值为空
<re.Match object; span=(0, 0), match=''>
>>> re.search('a*','Alex').group()
''
>>> re.search('a*','alex').group()
'a'
>>> re.search('a*','aaaalex').group()
'aaaa'
>>> re.search('ab*','abaaex').group() #可以加两个字符,但事实上匹配的还是前一个字符
'ab'
>>> re.search('ab*','ababbaex').group()
'ab'
>>> re.search('ab*','abbbbaex').group()
'abbbb'
  • '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
>>> re.search('a+','sdf')
>>> re.search('a+','abbaalex')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('a+','aaab')
<re.Match object; span=(0, 3), match='aaa'>
>>> re.search('.+','aaab') #'.' 是匹配除\n外任意字符,在这里就是全部匹配
<re.Match object; span=(0, 4), match='aaab'>
>>> re.search('ab+','aaab') #匹配 '+' 前的字符和最后一个字符
<re.Match object; span=(2, 4), match='ab'>
>>> re.search('ab+','aaabab')
<re.Match object; span=(2, 4), match='ab'>
>>> re.search('ab+','aaabbbbab')
<re.Match object; span=(2, 7), match='abbbb'>
>>> re.search('ab+','bbbbb') #匹配不到
  • '?' 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
>>> re.search('a?','aaab')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('a?','bbb')
<re.Match object; span=(0, 0), match=''>
  • '{m}' 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb'
>>> re.search('a{2}','ddd')
>>> re.search('a{2}','addd')
>>> re.search('a{2}','aaddd') #必须一次匹配两个
<re.Match object; span=(0, 2), match='aa'>
>>> re.search('a{2}','adaadd') #全局匹配
<re.Match object; span=(2, 4), match='aa'>
>>> re.search('a{2}','adaadd')
<re.Match object; span=(2, 4), match='aa'>
>>> re.search('.{2}','adaaadd') #'.' 是开头匹配两个
<re.Match object; span=(0, 2), match='ad'>
>>> re.search('[0-9]{2}','1234adaaadd') #匹配两个数字
<re.Match object; span=(0, 2), match=''>
  • '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
>>> re.search('[a-z]','alex')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('[a-z]{1,2}','alex') #尽可能匹配到最大
<re.Match object; span=(0, 2), match='al'>
>>> re.search('[a-z]{1,2}','a2lex')
<re.Match object; span=(0, 1), match='a'>
  • '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
>>> re.search('alex|Alex','alex') #匹配 alex 或 Alex
<re.Match object; span=(0, 4), match='alex'>
>>> re.search('a|Alex','alex') #匹配 a 或 Alex
<re.Match object; span=(0, 1), match='a'>
>>> re.search('[a|A]lex','alex') #匹配 alex 或 Alex
<re.Match object; span=(0, 4), match='alex'>
  • '(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45'
>>> re.search('[a-z]+','alex123')
<re.Match object; span=(0, 4), match='alex'>
>>> re.search('([a-z]+)([0-9]+)','alex123') #分别匹配小写字母和数字
<re.Match object; span=(0, 7), match='alex123'>
>>> re.search('([a-z]+)([0-9]+)','alex123').group()
'alex123'
>>> re.search('([a-z]+)([0-9]+)','alex123').groups() #将分别匹配出的结果分开
('alex', '')
  • '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
>>> re.search('\Aalex','alex789')  #相当于 re.search('^alex','alex789')、re.match('alex','alex789')
<re.Match object; span=(0, 4), match='alex'>
  • '\Z' 匹配字符结尾,同$
>>> re.search('[0-9]\Z','al***ex789peiqi562233')  #用法同 $
<re.Match object; span=(20, 21), match=''>
  • '\d' 匹配数字0-9
>>> re.search('\d','alex789')
<re.Match object; span=(4, 5), match=''>
>>> re.search('\d+','alex789')
<re.Match object; span=(4, 7), match=''>
>>> re.search('\d+','alex789peiqi562233')
<re.Match object; span=(4, 7), match=''>
  • '\D' 匹配非数字
>>> re.search('\D+','alex789peiqi562233')
<re.Match object; span=(0, 4), match='alex'>
>>> re.search('\D+','al***ex789peiqi562233')
<re.Match object; span=(0, 7), match='al***ex'>
  • '\w' 匹配[A-Za-z0-9] ,即匹配除特殊字符之外的所有
>>> re.search('\w','al***ex789peiqi562233')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('\w','alex789peiqi562233')
<re.Match object; span=(0, 1), match='a'>
>>> re.search('\w+','al***ex789peiqi562233')
<re.Match object; span=(0, 2), match='al'>
>>> re.search('\w+','alex789peiqi562233')
<re.Match object; span=(0, 18), match='alex789peiqi562233'>
  • '\W' 匹配非[A-Za-z0-9],即匹配特殊字符
>>> re.search('\W','al***ex789peiqi562233')
<re.Match object; span=(2, 3), match='*'>
>>> re.search('\W+','al***ex789peiqi562233')
<re.Match object; span=(2, 5), match='***'>
  • '\s' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
>>> s = 'alex\njack'
>>> re.search('\s',s)
<re.Match object; span=(4, 5), match='\n'>
>>> re.search('\s','alex\njack\tdd\rmack')
<re.Match object; span=(4, 5), match='\n'>
>>> re.findall('\s','alex\njack\tdd\rmack')
['\n', '\t', '\r']
  • '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 结果{'province': '3714', 'city': '81', 'birthday': '1993'}
>>> s = ''
>>> re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<bron_year>\d{4})',s) #不分组输出
<re.Match object; span=(0, 10), match=''>
>>> re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<bron_year>\d{4})',s).groups() #涉及分组,就用 groups()
('', '', '')
>>> res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<bron_year>\d{4})',s)
>>> res.groupdict() #以字典形式输出
{'province': '', 'city': '', 'bron_year': ''}

 re匹配语法详解

  • re.match 匹配开头,从头开始,只匹配一个字符,匹配到就返回结果,匹配不到无返回
>>> re.match('[0-9]','abc1d3e') 
  • re.search(pattern, string, flags=0)

    根据模型去字符串中匹配指定内容,匹配单个

>>> re.search('[0-9]','abc1d3e') #从头开始匹配,全局匹配,匹配到一个就返回
<re.Match object; span=(3, 4), match=''>
  • re.findall(pattern, string, flags=0)

    match and search均用于匹配单值,即:只能匹配字符串中的一个,如果想要匹配到字符串中所有符合条件的元素,则需要使用 findall。

>>> re.findall('[0-9]','abc1d3e') #全局匹配,将所有匹配到的放入列表中返回
['', '']
>>> if match_res:
... match_res.group() #有返回值的时候,返回结果,没有返回值,会报错
...
''
  • re.sub(pattern, repl, string, count=0, flags=0)

    用于替换匹配的字符串,相比于str.replace功能更加强大

>>> re.sub('\d+','_','alex22jack23rain31jinxin50|mack-oldboy') #全部替换
'alex_jack_rain_jinxin_|mack-oldboy'
>>> re.sub('\d+','_','alex22jack23rain31jinxin50|mack-oldboy',count = 2) #只替换前两个
'alex_jack_rain31jinxin50|mack-oldboy'
  • re.split(pattern, string, maxsplit=0, flags=0)
>>> re.split('\d','alex22jack23rain31jinxin50')  #只取一个数字,所以有空返回值
['alex', '', 'jack', '', 'rain', '', 'jinxin', '', '']
>>> re.split('\d+','alex22jack23rain31jinxin50') #去所有的数字,因为最后一个数字后面没东西了,所以有一个空返回值
['alex', 'jack', 'rain', 'jinxin', '']
>>> re.split('\d+|#|-','alex22jack23rain31jinxin50#mack-oldboy') #以数字、# 、- 分隔
['alex', 'jack', 'rain', 'jinxin', '', 'mack', 'oldboy']
>>> re.split('\|','jinxin50|mack-oldboy') #'\' 是转译字符,为了以 '|' 分隔
['jinxin50', 'mack-oldboy']
>>> re.split('\\\\','xin50\\mack-oldboy') #想以 '\' 分隔,必须是四个 '\'
['xin50', 'mack-oldboy']
>>> re.split('\\\\','xin50\mack-oldboy')
['xin50', 'mack-oldboy'] >>>s='9-2*5/3+7/3*99/4*2998+10*568/14'
>>>re.split('[\*\-\/\+]',s)
['', '', '', '', '', '', '', '', '', '', '', '']
>>> re.split('[\*\-\/\+]',s,3) #只分隔前三个
['', '', '', '3+7/3*99/4*2998+10*568/14']
  • re.fullmatch(pattern, string, flags=0)

    整个字符串匹配成功就返回re object, 否则返回None

>>> re.fullmatch('alex','alex123') #必须完全匹配
>>> re.fullmatch('alex123','alex123')
<re.Match object; span=(0, 7), match='alex123'>
>>> re.fullmatch('\w+@\w+\.(com|cn|edu)',"alex@oldboyedu.cn")
<re.Match object; span=(0, 17), match='alex@oldboyedu.cn'>
  • re.compile()  与直接使用 fullmatch 相比,可提高效率。
>>> pattern = re.compile('\w+@\w+\.(com|cn|edu)')
>>> pattern.fullmatch('alex@oldboyedu.cn')
<re.Match object; span=(0, 17), match='alex@oldboyedu.cn'>

Flags标识符

  • re.I(re.IGNORECASE):忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE):多行模式,改变 '^' 和 '$' 的行为
  • S(DOTALL):改变 '.' 的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match any except a newline.
  • X(re.VERBOSE):可以给你的表达式写注释,使其可读,下面这两个意思一样。
>>> re.search('a','Alex',re.I) #忽略大小写
<re.Match object; span=(0, 1), match='A'>
>>> re.search('foo.$','foo1\nfoo2\n')
<re.Match object; span=(5, 9), match='foo2'>
>>> re.search('foo.$','foo1\nfoo2\n',re.M) #匹配一行的结尾
<re.Match object; span=(0, 4), match='foo1'>
>>> re.search('.','\n') #匹配换行符之外的所有字符
>>> re.search('.','\n',re.S) #匹配所有的字符
<re.Match object; span=(0, 1), match='\n'>
>>> re.search('. #test','alex\n')
>>> re.search('. #test','alex\n',re.X) #加进注释
<re.Match object; span=(0, 1), match='a'>

Python全栈之路----常用模块----re 模块的更多相关文章

  1. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  2. Python全栈之路----常用模块----序列化(json&pickle&shelve)模块详解

    把内存数据转成字符,叫序列化:把字符转成内存数据类型,叫反序列化. Json模块 Json模块提供了四个功能:序列化:dumps.dump:反序列化:loads.load. import json d ...

  3. Python全栈之路----常用模块学习----模块的种类和导入方法

    什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...

  4. Python全栈之路----常用模块----软件开发目录规范

    目录基本内容 log  #日志目录 conf  #配置目录 core/luffycity  #程序核心代码目录  #luffycity 是项目名,建议用小写 libs/modules  #内置模块 d ...

  5. Python全栈之路----常用模块----logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  6. Python全栈之路----常用模块----subprocess模块

    我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...

  7. Python全栈之路----常用模块----shutil模块

    高级的 文件.文件包.压缩包 处理模块   参考Python之路[第四篇]:模块     #src是原文件名,fdst是新文件名 shutil.copyfileobj(fsrc, fdst[, len ...

  8. Python全栈之路----常用模块----datetime模块详解

    相比于time模块,datetime模块的接口则更直观,更容易调用. datetime模块定义了下面这几个类: datetime.date:表示日期的类,常用的属性有year,month,day: d ...

  9. Python全栈之路----常用模块----xml处理模块

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...

随机推荐

  1. lr_场景设计之组场景、nmon监控

    1.组场景常用于回归 ,可以设置成一个脚本后多久运行下一个脚本: Real-world Schedule和Basic schedule的区别:根据官方文档,这两种模式下,场景中的每个虚拟用户组(可看成 ...

  2. bootstrap全局样式

    内联子标题: 显示如下: 主体副本: 显示如下: 对齐类: 显示如下: 强调类: 显示如下: 缩略语: 地址: 表格: 加一个class:“table-striped” js里面的奇数偶数行(odd) ...

  3. vue做的第二个app

    用vue做应用最好的还是组件的复用上次做饿了吗的app封装了一个评分star的组件只要引入组件传入size大小和score分数就行了,这次做豆瓣直接就就用上了不用重复写代码.不过vue做单页应用全部挂 ...

  4. GoLand配置数据库、远程host以及远程调试

    GoLand配置MySQL数据库: (1)右侧栏 -> Database -> +添加 (2)选择MySQL (3)修改Name -> Comment(可选) (4)选择MySQL版 ...

  5. 自动化扫描src漏洞

    首先介绍一下常见的漏洞类型: 漏洞自动扫描思路: 常见的一些github上常用的漏洞采集工具,我们可以利用一款工具进行接口调用直接进行利用 自动化工具的雏形:

  6. 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)

    请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...

  7. 编码 decode & encode

    import sys # python3 中字符编码默认为 utf-8 s = '你好' print(s) # utf-8 转为 gbk (s 默认为 unicode 所以可以直接 encode 成 ...

  8. PHP 2个比较经典的加密解密函数

    这篇文章主要介绍了2个比较经典的PHP加密解密函数分享,一个是Discuz!的authcode加密函数(带详细分解),一个是encrypt()函数,都比较经典,需要的朋友可以参考下 项目中有时我们需要 ...

  9. git 的安装与初始化

    1搭建本地git服务器: 1.1安装git 对于ubuntu系统,一般自带git,可以使用git --version 查看版本号 ,或使用apt-get install git  . centos上对 ...

  10. 微信公众号开发前端获取openId

    参考 https://blog.csdn.net/qq_35430000/article/details/79299529