python正则模块re

  python中re中内置匹配、搜索、替换方法见博客---python附录-re.py模块源码(含re官方文档链接)

  正则的应用是处理一些字符串,phthon的博文python-基础学习篇(二)中提到了字符串类型有一些字符串内置的处理方法,但是需要了解一点内置方法是适用于一些简单字符串的处理,复杂的字符串处理方法还是正则表达式的天下。至于为啥要整一些内置方法,我个人认为对于一些简单应用中的字符串处理,无需使用一个整体的系统的正则知识,同时也是python易入门的体现。

  python中的正则内置于re模块中,使用正则之前需要导入re模块。

  1. import re

  有了之前的正则表达式的基础,我们可以写出一些正则表达式(pattern)了,如何使用正则表达式去处理字符串(string)呢?只能通过re模块中内置的几个方法去操作。

  re模块内置的函数方法

  re.compile(pattern, flags=0)

  re.compile()方法可以把一个正则表达式编译成一个正则对象(PatternObj),返回的正则对象是操作其他处理字符串方法的主体。

  1. pattern_obj = re.compile(pattern)
  2. match_obj = pattern_obj.compile(string)

  等同于

  1. match_obj = re.match(pattern,string)

  实际上re.match()处理流程内含re.compile()的过程。match方法源码:

  1. def match(pattern, string, flags=0):
  2. """Try to apply the pattern at the start of the string, returning
  3. a Match object, or None if no match was found."""
  4. return _compile(pattern, flags).match(string)

  可以看出match方法返回的实际就是正则对象pattern_obj调用match()方法的结果。

  re.search(pattern, string, flags=0)

  re.search()方法是搜索整个字符串,找到第一个符合正则规则的字符串部分,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。

  1. import re
  2.  
  3. pattern = r'the'
  4. match_obj = re.search(pattern, 'The dog is eating the bone', re.I)
  5. print(match_obj.group(0))
  6. print(match_obj)
  7.  
  8. # The
  9. # <re.Match object; span=(0, 3), match='The'>

  re.match(pattern, string, flags=0)

  re.match()方法是从字符串开始位置匹配整个字符串,当从字符串开始成功匹配到部分字符内容,返回一个匹配对象(MatchObject);没有匹配成功,就返回None。

  1. import re
  2.  
  3. pattern = r'the'
  4. match_obj = re.match(pattern, 'Dog is eating the bone', re.I)
  5. print(match_obj)
  6.  
  7. # None

  对比

  1. import re
  2.  
  3. pattern = r'the'
  4. match_obj = re.match(pattern, 'The dog is eating the bone', re.I)
  5. print(match_obj.group(0))
  6. print(match_obj)
  7.  
  8. # The
  9. # <re.Match object; span=(0, 3), match='The'>

  re.search()和re.match()区别对比:位置上,search()方法可以从字符串任意位置匹配部分字符串内容,match()方法必须从字符串开始位置匹配字符串内容,一旦开头匹配不成,则匹配失败;内容上,search()方法是非贪婪匹配,只要找到第一个符合正则规则的部分字符串就返回匹配对象,match()方法则是按照正则规则只匹配字符串开始位置的部分字符串;多行模式下,match()方法依旧只会匹配字符串的开始位置,而search()方法和“^”联合使用则是从多行的每一行开始匹配。

  re.fullmatch(pattern, string, flags=0)

  re.fullmatch()相似于re.match()是从字符串开始位置开始匹配,re.match()是匹配字符串部分或者全部,而re.fullmatch()是匹配字符串的全部,当且仅当正则表达式匹配整个字符串内容的时候,返回一个匹配对象MatchObject,否则返回None。

  re.split(pattern, string, maxsplit=0, flags=0)

  re.split()表示对字符串string,按照正则表达式pattern匹配内容分隔字符串,其中maxsplit是指最大分隔次数,最大分隔次数应该是小于默认分隔次数的。分隔后的字符串内容组成列表返回。

  1. import re
  2.  
  3. split_list_default = re.split(r'\W+', 'Words, words, words.')
  4. print(split_list_default)
  5.  
  6. # ['Words', 'words', 'words', ''] 正则表达式\W+表示以一个或多个非单词字符对字符串分隔,分隔后组成列表的形式返回,注意列表后空字符串为'.'和之前的words分隔结果
  7.  
  8. split_list_max = re.split(r'\W+', 'Words, words, words.', 1)
  9. print(split_list_max)
  10.  
  11. # ['Words', 'words, words.'] 指定分隔次数,字符串分隔会由左至右按照maxsplit最大分隔次数分隔,实际最大分隔次数是小于等于默认分隔次数的
  12.  
  13. split_list_couple = re.split(r'(\W+)', 'Words, words, words.')
  14. print(split_list_couple)
  15.  
  16. # ['Words', ', ', 'words', ', ', 'words', '.', ''] 正则表达式中存在分组情况,即捕获型括号,(\W+)会捕获字符串中‘, ’并添加至列表一起显示出来

  re.findall(pattern, string, flags=0)

  re.findall()类似于re.search()方法,re.search()是在字符串中搜索到第一个与正则表达式匹配的字符串内容就返回一个匹配对象MatchObject,而re.findall()方法是在字符串中搜索并找到所有与正则表达式匹配的字符串内容,组成一个列表返回,列表中元素顺序是按照正则表达式在字符串中由左至右匹配的返回;未匹配成功,返回一个空列表。

  1. import re
  2.  
  3. pattern = r'\d{3}'
  4. find = re.findall(pattern, 'include21321exclude13243alert213lib32')
  5. print(find)
  6.  
  7. # ['213', '132', '213']

  注意:当re.findall()中的正则表达式存在两个或两个以上分组时,按照分组自左向右的形式匹配,匹配结果按照顺序组成元组,返回列表中元素以元组的形式给出。

  1. import re
  2.  
  3. pattern = r'(\d{3})(1)'
  4. find = re.findall(pattern, 'include21321exclude13243alert213lib32')
  5. print(find)
  6.  
  7. # [('132', '1')]

  re.finditer(pattern, string, flags=0)

  re.finditer()相似于re.findall()方法,搜索字符串中所有与正则表达式匹配的字符串内容,返回一个迭代器Iterator,迭代器Iterator内保存了所有匹配字符串内容生成的匹配对象MatchObject。即匹配文本封装在匹配对象MatchObject中,多个匹配对象MatchObject保存在一个迭代器Iterator中。

  1. import re
  2.  
  3. pattern = r'\d{3}'
  4. find = re.finditer(pattern, 'include21321exclude13243alert213lib32')
  5. print(find)
  6. for i in find:
  7. print(i)
  8. print(i.group(0))
  9.  
  10. # <callable_iterator object at 0x00000000028FB0F0>
  11. # <re.Match object; span=(7, 10), match='213'>
  12. #
  13. # <re.Match object; span=(19, 22), match='132'>
  14. #
  15. # <re.Match object; span=(29, 32), match='213'>
  16. #

  re.sub(pattern, repl, string, count=0, flags=0)

  re.sub()表示用正则表达式匹配字符串string中的字符串内容,使用repl参数内容替换匹配完成的字符串内容,返回替换后的字符串。参数count指定替换次数,正则表达式匹配字符串是由左至右的,可能匹配多个内容,替换操作也是自左向右替换,如果只想替换左边部分匹配内容可以设置count参数,参数值为非负整数且小于等于最大匹配成功个数;未匹配成功,不做替换,返回原字符串。

  1. import re
  2.  
  3. pattern = r'\d+'
  4. find_default = re.sub(pattern, ' ', 'include21321exclude13243alert213lib32')
  5. print(find_default)
  6.  
  7. find_count = re.sub(pattern, ' ', 'include21321exclude13243alert213lib32', 2)
  8. print(find_count)
  9.  
  10. # include exclude alert lib
  11. # include exclude alert213lib32

  注意:repl参数内容可以是字符串也可以是函数,如果repl是函数,要求这个函数只能有一个匹配对象MatchObject参数,将匹配成功后生成的匹配对象传入函数处理后拼接到原字符串返回。

  1. import re
  2.  
  3. def replace_func(match_obj):
  4. if match_obj.group(0).isdigit():
  5. return ' '
  6. else:
  7. return '-'
  8.  
  9. pattern = r'\d+'
  10. find_default = re.sub(pattern, replace_func, 'include21321exclude13243alert213lib32')
  11. print(find_default)
  12.  
  13. # include exclude alert lib

  re.subn(pattern, repl, string, count=0, flags=0)

  re.subn()与re.sub()作用相同,只在返回结果有所差别,re.sub()返回是替换后的字符串,而re.subn()返回是一个由替换后的字符串和替换次数组合成的元组。

  1. import re
  2.  
  3. def replace_func(match_obj):
  4. if match_obj.group(0).isdigit():
  5. return ' '
  6. else:
  7. return '-'
  8.  
  9. pattern = r'\d+'
  10. find_default = re.subn(pattern, replace_func, 'include21321exclude13243alert213lib32')
  11. print(find_default)
  12.  
  13. # ('include exclude alert lib ', 4)

  re.escape(pattern)

  转义正则表达式中可以产生特殊含义的字符,主要用于匹配文本字符串中含有正则表达式的情形。

  1. import re
  2.  
  3. result = re.escape('\d*')
  4. print(result)
  5.  
  6. # \\d\*

  re.purge()

  清除正则表达式缓存

  参数flags

  上述方法中含有默认参数flags=0,可以通过函数的调用为flags指定特殊的参数值来指定匹配模式。常用参数值有:

  re.I(re.IGNORECASE),不区分大小写模式;

  re.M(re.MULTILINE),多行模式;

  re.S(re.DOTALL),单行模式;

  re.X(re.VERBOSE),注释模式;

  正则对象(Pattern)

  正则对象可以使用直接调用上述方法,在re.match()方法中有所描述。由match()方法到subn()方法都是正则对象Pattern的实例方法,正则对象Pattern的实例属性有:

  Pattern.flags

  指定或获取匹配模式,如:Pattern.flags = re.I,但是一般不直接操作实例属性,由实例方法操作实例属性,故该属性多用于获取匹配模式。

  Pattern.groups

  获取捕获分组的数量。

  Pattern.pattern

  获取原始正则表达式

  匹配对象(MatchObject)

  匹配对象是对匹配内容的封装。

  MatchObject.group(num)

  获取匹配对象中封装的匹配内容,group(0)表示获取全部内容,大于等于1表示获取对应捕获分组中的内容。

  1. import re
  2.  
  3. pattern = r'(\w+) (\w+)'
  4. match_obj = re.match(pattern, 'Snow Stack')
  5. print(match_obj.group(0))
  6. print(match_obj.group(1))
  7. print(match_obj.group(2))
  8.  
  9. # Snow Stack
  10. # Snow
  11. # Stack

  MatchObject.__getitem__(num)

  作用同MatchObject.group(num)。

  1. import re
  2.  
  3. pattern = r'(\w+) (\w+)'
  4. match_obj = re.match(pattern, 'Snow Stack')
  5. print(match_obj[0])
  6. print(match_obj[1])
  7. print(match_obj[2])
  8.  
  9. # Snow Stack
  10. # Snow
  11. # Stack

  MatchObject.groups()

  以元组的形式返回所有捕获分组内容,只返回捕获分组中的内容,不包含其他匹配内容。

  1. import re
  2.  
  3. pattern = r'(\w+) (\w+)'
  4. match_obj = re.match(pattern, 'Snow Stack')
  5. print(match_obj.groups())
  6.  
  7. # ('Snow', 'Stack')

  MatchObject.groupdict()

  返回一个字典,包含了所有的命名子组。key就是组名,value就是捕获分组匹配的内容。

  1. import re
  2.  
  3. pattern = r'(?P<first_name>\w+) (?P<last_name>\w+)'
  4. match_obj = re.match(pattern, 'Snow Stack')
  5. print(match_obj.groupdict())
  6.  
  7. # {'first_name': 'Snow', 'last_name': 'Stack'}

认识python正则模块re的更多相关文章

  1. python:正则模块

    1,正则表达式 正则表达式是用来做字符串的匹配的,正则有他自己的规则,和python没有关系,一种匹配字符串的规则. 2,字符组 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表 ...

  2. 19 Python 正则模块和正则表达式

    什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的代码(.p ...

  3. Python——正则模块

    1.re模块是用来操作正则表达式 2.正则表达式——用来字符串匹配的 (1)字符组:[字符组]  例如[0123fdsa456*/-] [0-9] 等同于[0123456789] [a-z] 匹配小写 ...

  4. Python正则模块

    re模块 import re # match # 从头开始匹配, 只匹配一次,就结束 a = re.match('\d+', '54:58天5488:8451') # 默认就是0个群组 print(a ...

  5. Python全栈开发【re正则模块】

    re正则模块 本节内容: 正则介绍 元字符及元字符集 元字符转义符 re模块下的常用方法 正则介绍(re) 正则表达式(或 RE)是一种小型的.高度专业化的编程语言. 在Python中,它内嵌在Pyt ...

  6. 小白的Python之路 day5 re正则模块

    re正则模块 一.概述 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,要讲他的具体用法要讲一本书!它内嵌在Python中,并通过 re 模块实现.你可以为想要匹配的相应字符串 ...

  7. Python 正则处理_re模块

    正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...

  8. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  9. python——re模块(正则表达)

    python——re模块(正则表达) 两个比较不错的正则帖子: http://blog.csdn.net/riba2534/article/details/54288552 http://blog.c ...

随机推荐

  1. docker跨主机互联

    以下内容只是命令,原理自行百度,google或者官方查阅! 方案一.overlay Consul 三台主机为例(都要安装docker): 192.168.20.20(consul服务) 192.168 ...

  2. WebAPI请求(转)

    出处:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  3. jquery对属性和特性的操作

    attribute(特性)和property(属性)是两个不同的概念.attribute表示HTML文档节点的特性,property表示DOM元素的属性 这些属性例如selectedIndex, ta ...

  4. Webservice初级问题: FAILED TO READ WSDL document

    这个问题是说明,这个版本的没法下载 犯错的图样 处理方法一: 将网页上xml文档下载,保存在本地,然后错误提示的这几行删除,保存文档,然后从本地调用 (1)右键另存为 保存为文件名a.xml (2)打 ...

  5. Kinect-for-Windows-SDK开发

    微软的黑科技,应用在游戏或者科研领域.可以类似于双摄像头三维成像.

  6. (广搜)Catch That Cow -- poj -- 3278

    链接: http://poj.org/problem?id=3278 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6211 ...

  7. HDU1412:{A} + {B}

    Problem Description 给你两个集合,要求{A} + {B}. 注:同一个集合中不会有两个相同的元素.   Input 每组输入数据分为三行,第一行有两个数字n,m(0<n,m& ...

  8. SparkSQL大数据实战:揭开Join的神秘面纱

    本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...

  9. 注意力机制(Attention Mechanism)应用——自然语言处理(NLP)

    近年来,深度学习的研究越来越深入,在各个领域也都获得了不少突破性的进展.基于注意力(attention)机制的神经网络成为了最近神经网络研究的一个热点,下面是一些基于attention机制的神经网络在 ...

  10. Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置

    Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的 ...