正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,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. java中之内存溢出说明

    java语句是编译型和解释型语言,选通过编译命令javac 把java文件编译为.class字节码文件,然后通过java虚拟机(JVM)加载class文件到内存运行. 而java虚拟机在运行程序时有自 ...

  2. docker搭建elk

    docker run -d -p 5601:5601 -p 9200:9200  -p 5044:5044 -v /opt/data/elk-data:/var/lib/elasticsearch - ...

  3. 小白的python之路Linux部分10/28&29

    属主属组其他人对文件的rwx权限 1.userdel删东西不全,会有残留,

  4. Mysql 了解changeBuffer 与 purge 调优

    需要删除.新增记录或更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer中, ...

  5. sql排列组合

    一个表中4条记录,如何查询所有可能组成的结果. 例如: 1  2  3  4 四条记录,最后组成(12),(13),(14),(23),(24),(34) 最后sql如下: SELECT a.name ...

  6. LVM逻辑卷扩容、缩容

    LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理. 后期出现问题恢复数据也比较麻烦. 概念: ①PE(P ...

  7. web语言发展史

    引用自CSDN,地址:https://blog.csdn.net/moshenglv/article/details/51590830 提到Web,不得不提一个词就是“互联网”.Web是World W ...

  8. EXCEL查找函数之VLOOKUP,LOOKUP,HLOOKUP

    VLOOKUP是纵向查询函数,VLOOKUP(lookup_value,table_array,col_index_num,range_lookup). 参数                      ...

  9. Sql Server 2012 集群配置

    基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group) 2012年5月 微软新一代数据库产品SQL Server 201 ...

  10. hive批量删除表

    #!/bin/shhive -e "use csxuy;show tables;"|grep product_tour2 | while read linedoecho -n &q ...